Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
* 'for-linus' of git://oss.sgi.com/xfs/xfs: (23 commits) xfs: don't name variables "panic" xfs: factor agf counter updates into a helper xfs: clean up the xfs_alloc_compute_aligned calling convention xfs: kill support/debug.[ch] xfs: Convert remaining cmn_err() callers to new API xfs: convert the quota debug prints to new API xfs: rename xfs_cmn_err_fsblock_zero() xfs: convert xfs_fs_cmn_err to new error logging API xfs: kill xfs_fs_mount_cmn_err() macro xfs: kill xfs_fs_repair_cmn_err() macro xfs: convert xfs_cmn_err to xfs_alert_tag xfs: Convert xlog_warn to new logging interface xfs: Convert linux-2.6/ files to new logging interface xfs: introduce new logging API. xfs: zero proper structure size for geometry calls xfs: enable delaylog by default xfs: more sensible inode refcounting for ialloc xfs: stop using xfs_trans_iget in the RT allocator xfs: check if device support discard in xfs_ioc_trim() xfs: prevent leaking uninitialized stack memory in FSGEOMETRY_V1 ...
This commit is contained in:
commit
3155fe6df5
|
@ -791,10 +791,3 @@ mount option. Fundamentally, there is no reason why the log manager would not
|
|||
be able to swap methods automatically and transparently depending on load
|
||||
characteristics, but this should not be necessary if delayed logging works as
|
||||
designed.
|
||||
|
||||
Roadmap:
|
||||
|
||||
2.6.39 Switch default mount option to use delayed logging
|
||||
=> should be roughly 12 months after initial merge
|
||||
=> enough time to shake out remaining problems before next round of
|
||||
enterprise distro kernel rebases
|
||||
|
|
|
@ -102,11 +102,10 @@ xfs-y += $(addprefix $(XFS_LINUX)/, \
|
|||
xfs_globals.o \
|
||||
xfs_ioctl.o \
|
||||
xfs_iops.o \
|
||||
xfs_message.o \
|
||||
xfs_super.o \
|
||||
xfs_sync.o \
|
||||
xfs_xattr.o)
|
||||
|
||||
# Objects in support/
|
||||
xfs-y += $(addprefix support/, \
|
||||
debug.o \
|
||||
uuid.o)
|
||||
xfs-y += support/uuid.o
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/backing-dev.h>
|
||||
#include "time.h"
|
||||
#include "kmem.h"
|
||||
#include "xfs_message.h"
|
||||
|
||||
/*
|
||||
* Greedy allocation. May fail and may return vmalloced memory.
|
||||
|
@ -56,8 +57,8 @@ kmem_alloc(size_t size, unsigned int __nocast flags)
|
|||
if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP)))
|
||||
return ptr;
|
||||
if (!(++retries % 100))
|
||||
printk(KERN_ERR "XFS: possible memory allocation "
|
||||
"deadlock in %s (mode:0x%x)\n",
|
||||
xfs_err(NULL,
|
||||
"possible memory allocation deadlock in %s (mode:0x%x)",
|
||||
__func__, lflags);
|
||||
congestion_wait(BLK_RW_ASYNC, HZ/50);
|
||||
} while (1);
|
||||
|
@ -112,8 +113,8 @@ kmem_zone_alloc(kmem_zone_t *zone, unsigned int __nocast flags)
|
|||
if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP)))
|
||||
return ptr;
|
||||
if (!(++retries % 100))
|
||||
printk(KERN_ERR "XFS: possible memory allocation "
|
||||
"deadlock in %s (mode:0x%x)\n",
|
||||
xfs_err(NULL,
|
||||
"possible memory allocation deadlock in %s (mode:0x%x)",
|
||||
__func__, lflags);
|
||||
congestion_wait(BLK_RW_ASYNC, HZ/50);
|
||||
} while (1);
|
||||
|
|
|
@ -854,7 +854,7 @@ xfs_aops_discard_page(
|
|||
if (XFS_FORCED_SHUTDOWN(ip->i_mount))
|
||||
goto out_invalidate;
|
||||
|
||||
xfs_fs_cmn_err(CE_ALERT, ip->i_mount,
|
||||
xfs_alert(ip->i_mount,
|
||||
"page discard on page %p, inode 0x%llx, offset %llu.",
|
||||
page, ip->i_ino, offset);
|
||||
|
||||
|
@ -872,7 +872,7 @@ xfs_aops_discard_page(
|
|||
if (error) {
|
||||
/* something screwed, just bail */
|
||||
if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) {
|
||||
xfs_fs_cmn_err(CE_ALERT, ip->i_mount,
|
||||
xfs_alert(ip->i_mount,
|
||||
"page discard unable to remove delalloc mapping.");
|
||||
}
|
||||
break;
|
||||
|
@ -1411,7 +1411,7 @@ xfs_vm_write_failed(
|
|||
if (error) {
|
||||
/* something screwed, just bail */
|
||||
if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) {
|
||||
xfs_fs_cmn_err(CE_ALERT, ip->i_mount,
|
||||
xfs_alert(ip->i_mount,
|
||||
"xfs_vm_write_failed: unable to clean up ino %lld",
|
||||
ip->i_ino);
|
||||
}
|
||||
|
|
|
@ -401,9 +401,8 @@ _xfs_buf_lookup_pages(
|
|||
* handle buffer allocation failures we can't do much.
|
||||
*/
|
||||
if (!(++retries % 100))
|
||||
printk(KERN_ERR
|
||||
"XFS: possible memory allocation "
|
||||
"deadlock in %s (mode:0x%x)\n",
|
||||
xfs_err(NULL,
|
||||
"possible memory allocation deadlock in %s (mode:0x%x)",
|
||||
__func__, gfp_mask);
|
||||
|
||||
XFS_STATS_INC(xb_page_retries);
|
||||
|
@ -615,8 +614,8 @@ xfs_buf_get(
|
|||
if (!(bp->b_flags & XBF_MAPPED)) {
|
||||
error = _xfs_buf_map_pages(bp, flags);
|
||||
if (unlikely(error)) {
|
||||
printk(KERN_WARNING "%s: failed to map pages\n",
|
||||
__func__);
|
||||
xfs_warn(target->bt_mount,
|
||||
"%s: failed to map pages\n", __func__);
|
||||
goto no_buffer;
|
||||
}
|
||||
}
|
||||
|
@ -850,8 +849,8 @@ xfs_buf_get_uncached(
|
|||
|
||||
error = _xfs_buf_map_pages(bp, XBF_MAPPED);
|
||||
if (unlikely(error)) {
|
||||
printk(KERN_WARNING "%s: failed to map pages\n",
|
||||
__func__);
|
||||
xfs_warn(target->bt_mount,
|
||||
"%s: failed to map pages\n", __func__);
|
||||
goto fail_free_mem;
|
||||
}
|
||||
|
||||
|
@ -1617,8 +1616,8 @@ xfs_setsize_buftarg_flags(
|
|||
btp->bt_smask = sectorsize - 1;
|
||||
|
||||
if (set_blocksize(btp->bt_bdev, sectorsize)) {
|
||||
printk(KERN_WARNING
|
||||
"XFS: Cannot set_blocksize to %u on device %s\n",
|
||||
xfs_warn(btp->bt_mount,
|
||||
"Cannot set_blocksize to %u on device %s\n",
|
||||
sectorsize, XFS_BUFTARG_NAME(btp));
|
||||
return EINVAL;
|
||||
}
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
#include <mrlock.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <support/debug.h>
|
||||
#include <support/uuid.h>
|
||||
|
||||
#include <linux/semaphore.h>
|
||||
|
@ -86,6 +85,7 @@
|
|||
#include <xfs_aops.h>
|
||||
#include <xfs_super.h>
|
||||
#include <xfs_buf.h>
|
||||
#include <xfs_message.h>
|
||||
|
||||
/*
|
||||
* Feature macros (disable/enable)
|
||||
|
@ -280,4 +280,25 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y)
|
|||
#define __arch_pack
|
||||
#endif
|
||||
|
||||
#define ASSERT_ALWAYS(expr) \
|
||||
(unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__))
|
||||
|
||||
#ifndef DEBUG
|
||||
#define ASSERT(expr) ((void)0)
|
||||
|
||||
#ifndef STATIC
|
||||
# define STATIC static noinline
|
||||
#endif
|
||||
|
||||
#else /* DEBUG */
|
||||
|
||||
#define ASSERT(expr) \
|
||||
(unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__))
|
||||
|
||||
#ifndef STATIC
|
||||
# define STATIC noinline
|
||||
#endif
|
||||
|
||||
#endif /* DEBUG */
|
||||
|
||||
#endif /* __XFS_LINUX__ */
|
||||
|
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* Copyright (c) 2011 Red Hat, Inc. All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it would be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "xfs.h"
|
||||
#include "xfs_fs.h"
|
||||
#include "xfs_types.h"
|
||||
#include "xfs_log.h"
|
||||
#include "xfs_inum.h"
|
||||
#include "xfs_trans.h"
|
||||
#include "xfs_sb.h"
|
||||
#include "xfs_ag.h"
|
||||
#include "xfs_mount.h"
|
||||
|
||||
/*
|
||||
* XFS logging functions
|
||||
*/
|
||||
static int
|
||||
__xfs_printk(
|
||||
const char *level,
|
||||
const struct xfs_mount *mp,
|
||||
struct va_format *vaf)
|
||||
{
|
||||
if (mp && mp->m_fsname)
|
||||
return printk("%sXFS (%s): %pV\n", level, mp->m_fsname, vaf);
|
||||
return printk("%sXFS: %pV\n", level, vaf);
|
||||
}
|
||||
|
||||
int xfs_printk(
|
||||
const char *level,
|
||||
const struct xfs_mount *mp,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
int r;
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
r = __xfs_printk(level, mp, &vaf);
|
||||
va_end(args);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
#define define_xfs_printk_level(func, kern_level) \
|
||||
int func(const struct xfs_mount *mp, const char *fmt, ...) \
|
||||
{ \
|
||||
struct va_format vaf; \
|
||||
va_list args; \
|
||||
int r; \
|
||||
\
|
||||
va_start(args, fmt); \
|
||||
\
|
||||
vaf.fmt = fmt; \
|
||||
vaf.va = &args; \
|
||||
\
|
||||
r = __xfs_printk(kern_level, mp, &vaf); \
|
||||
va_end(args); \
|
||||
\
|
||||
return r; \
|
||||
} \
|
||||
|
||||
define_xfs_printk_level(xfs_emerg, KERN_EMERG);
|
||||
define_xfs_printk_level(xfs_alert, KERN_ALERT);
|
||||
define_xfs_printk_level(xfs_crit, KERN_CRIT);
|
||||
define_xfs_printk_level(xfs_err, KERN_ERR);
|
||||
define_xfs_printk_level(xfs_warn, KERN_WARNING);
|
||||
define_xfs_printk_level(xfs_notice, KERN_NOTICE);
|
||||
define_xfs_printk_level(xfs_info, KERN_INFO);
|
||||
#ifdef DEBUG
|
||||
define_xfs_printk_level(xfs_debug, KERN_DEBUG);
|
||||
#endif
|
||||
|
||||
int
|
||||
xfs_alert_tag(
|
||||
const struct xfs_mount *mp,
|
||||
int panic_tag,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
int do_panic = 0;
|
||||
int r;
|
||||
|
||||
if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) {
|
||||
xfs_printk(KERN_ALERT, mp,
|
||||
"XFS: Transforming an alert into a BUG.");
|
||||
do_panic = 1;
|
||||
}
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
r = __xfs_printk(KERN_ALERT, mp, &vaf);
|
||||
va_end(args);
|
||||
|
||||
BUG_ON(do_panic);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void
|
||||
assfail(char *expr, char *file, int line)
|
||||
{
|
||||
xfs_emerg(NULL, "Assertion failed: %s, file: %s, line: %d",
|
||||
expr, file, line);
|
||||
BUG();
|
||||
}
|
||||
|
||||
void
|
||||
xfs_hex_dump(void *p, int length)
|
||||
{
|
||||
print_hex_dump(KERN_ALERT, "", DUMP_PREFIX_ADDRESS, 16, 1, p, length, 1);
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
#ifndef __XFS_MESSAGE_H
|
||||
#define __XFS_MESSAGE_H 1
|
||||
|
||||
struct xfs_mount;
|
||||
|
||||
extern int xfs_printk(const char *level, const struct xfs_mount *mp,
|
||||
const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 3, 4)));
|
||||
extern int xfs_emerg(const struct xfs_mount *mp, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
extern int xfs_alert(const struct xfs_mount *mp, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
extern int xfs_alert_tag(const struct xfs_mount *mp, int tag,
|
||||
const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 3, 4)));
|
||||
extern int xfs_crit(const struct xfs_mount *mp, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
extern int xfs_err(const struct xfs_mount *mp, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
extern int xfs_warn(const struct xfs_mount *mp, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
extern int xfs_notice(const struct xfs_mount *mp, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
extern int xfs_info(const struct xfs_mount *mp, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
|
||||
#ifdef DEBUG
|
||||
extern int xfs_debug(const struct xfs_mount *mp, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
#else
|
||||
#define xfs_debug(mp, fmt, ...) (0)
|
||||
#endif
|
||||
|
||||
extern void assfail(char *expr, char *f, int l);
|
||||
|
||||
extern void xfs_hex_dump(void *p, int length);
|
||||
|
||||
#endif /* __XFS_MESSAGE_H */
|
|
@ -172,6 +172,15 @@ xfs_parseargs(
|
|||
int iosize = 0;
|
||||
__uint8_t iosizelog = 0;
|
||||
|
||||
/*
|
||||
* set up the mount name first so all the errors will refer to the
|
||||
* correct device.
|
||||
*/
|
||||
mp->m_fsname = kstrndup(sb->s_id, MAXNAMELEN, GFP_KERNEL);
|
||||
if (!mp->m_fsname)
|
||||
return ENOMEM;
|
||||
mp->m_fsname_len = strlen(mp->m_fsname) + 1;
|
||||
|
||||
/*
|
||||
* Copy binary VFS mount flags we are interested in.
|
||||
*/
|
||||
|
@ -189,6 +198,7 @@ xfs_parseargs(
|
|||
mp->m_flags |= XFS_MOUNT_BARRIER;
|
||||
mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE;
|
||||
mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
|
||||
mp->m_flags |= XFS_MOUNT_DELAYLOG;
|
||||
|
||||
/*
|
||||
* These can be overridden by the mount option parsing.
|
||||
|
@ -207,24 +217,21 @@ xfs_parseargs(
|
|||
|
||||
if (!strcmp(this_char, MNTOPT_LOGBUFS)) {
|
||||
if (!value || !*value) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option requires an argument",
|
||||
xfs_warn(mp, "%s option requires an argument",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
}
|
||||
mp->m_logbufs = simple_strtoul(value, &eov, 10);
|
||||
} else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) {
|
||||
if (!value || !*value) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option requires an argument",
|
||||
xfs_warn(mp, "%s option requires an argument",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
}
|
||||
mp->m_logbsize = suffix_strtoul(value, &eov, 10);
|
||||
} else if (!strcmp(this_char, MNTOPT_LOGDEV)) {
|
||||
if (!value || !*value) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option requires an argument",
|
||||
xfs_warn(mp, "%s option requires an argument",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
}
|
||||
|
@ -232,14 +239,12 @@ xfs_parseargs(
|
|||
if (!mp->m_logname)
|
||||
return ENOMEM;
|
||||
} else if (!strcmp(this_char, MNTOPT_MTPT)) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option not allowed on this system",
|
||||
xfs_warn(mp, "%s option not allowed on this system",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
} else if (!strcmp(this_char, MNTOPT_RTDEV)) {
|
||||
if (!value || !*value) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option requires an argument",
|
||||
xfs_warn(mp, "%s option requires an argument",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
}
|
||||
|
@ -248,8 +253,7 @@ xfs_parseargs(
|
|||
return ENOMEM;
|
||||
} else if (!strcmp(this_char, MNTOPT_BIOSIZE)) {
|
||||
if (!value || !*value) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option requires an argument",
|
||||
xfs_warn(mp, "%s option requires an argument",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
}
|
||||
|
@ -257,8 +261,7 @@ xfs_parseargs(
|
|||
iosizelog = ffs(iosize) - 1;
|
||||
} else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) {
|
||||
if (!value || !*value) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option requires an argument",
|
||||
xfs_warn(mp, "%s option requires an argument",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
}
|
||||
|
@ -280,16 +283,14 @@ xfs_parseargs(
|
|||
mp->m_flags |= XFS_MOUNT_SWALLOC;
|
||||
} else if (!strcmp(this_char, MNTOPT_SUNIT)) {
|
||||
if (!value || !*value) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option requires an argument",
|
||||
xfs_warn(mp, "%s option requires an argument",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
}
|
||||
dsunit = simple_strtoul(value, &eov, 10);
|
||||
} else if (!strcmp(this_char, MNTOPT_SWIDTH)) {
|
||||
if (!value || !*value) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option requires an argument",
|
||||
xfs_warn(mp, "%s option requires an argument",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
}
|
||||
|
@ -297,8 +298,7 @@ xfs_parseargs(
|
|||
} else if (!strcmp(this_char, MNTOPT_64BITINODE)) {
|
||||
mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS;
|
||||
#if !XFS_BIG_INUMS
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: %s option not allowed on this system",
|
||||
xfs_warn(mp, "%s option not allowed on this system",
|
||||
this_char);
|
||||
return EINVAL;
|
||||
#endif
|
||||
|
@ -356,20 +356,19 @@ xfs_parseargs(
|
|||
} else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) {
|
||||
mp->m_flags &= ~XFS_MOUNT_DELAYLOG;
|
||||
} else if (!strcmp(this_char, "ihashsize")) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: ihashsize no longer used, option is deprecated.");
|
||||
xfs_warn(mp,
|
||||
"ihashsize no longer used, option is deprecated.");
|
||||
} else if (!strcmp(this_char, "osyncisdsync")) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: osyncisdsync has no effect, option is deprecated.");
|
||||
xfs_warn(mp,
|
||||
"osyncisdsync has no effect, option is deprecated.");
|
||||
} else if (!strcmp(this_char, "osyncisosync")) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: osyncisosync has no effect, option is deprecated.");
|
||||
xfs_warn(mp,
|
||||
"osyncisosync has no effect, option is deprecated.");
|
||||
} else if (!strcmp(this_char, "irixsgid")) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: irixsgid is now a sysctl(2) variable, option is deprecated.");
|
||||
xfs_warn(mp,
|
||||
"irixsgid is now a sysctl(2) variable, option is deprecated.");
|
||||
} else {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: unknown mount option [%s].", this_char);
|
||||
xfs_warn(mp, "unknown mount option [%s].", this_char);
|
||||
return EINVAL;
|
||||
}
|
||||
}
|
||||
|
@ -379,40 +378,37 @@ xfs_parseargs(
|
|||
*/
|
||||
if ((mp->m_flags & XFS_MOUNT_NORECOVERY) &&
|
||||
!(mp->m_flags & XFS_MOUNT_RDONLY)) {
|
||||
cmn_err(CE_WARN, "XFS: no-recovery mounts must be read-only.");
|
||||
xfs_warn(mp, "no-recovery mounts must be read-only.");
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
if ((mp->m_flags & XFS_MOUNT_NOALIGN) && (dsunit || dswidth)) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: sunit and swidth options incompatible with the noalign option");
|
||||
xfs_warn(mp,
|
||||
"sunit and swidth options incompatible with the noalign option");
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_XFS_QUOTA
|
||||
if (XFS_IS_QUOTA_RUNNING(mp)) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: quota support not available in this kernel.");
|
||||
xfs_warn(mp, "quota support not available in this kernel.");
|
||||
return EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ((mp->m_qflags & (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE)) &&
|
||||
(mp->m_qflags & (XFS_PQUOTA_ACCT | XFS_PQUOTA_ACTIVE))) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: cannot mount with both project and group quota");
|
||||
xfs_warn(mp, "cannot mount with both project and group quota");
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
if ((dsunit && !dswidth) || (!dsunit && dswidth)) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: sunit and swidth must be specified together");
|
||||
xfs_warn(mp, "sunit and swidth must be specified together");
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
if (dsunit && (dswidth % dsunit != 0)) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: stripe width (%d) must be a multiple of the stripe unit (%d)",
|
||||
xfs_warn(mp,
|
||||
"stripe width (%d) must be a multiple of the stripe unit (%d)",
|
||||
dswidth, dsunit);
|
||||
return EINVAL;
|
||||
}
|
||||
|
@ -438,8 +434,7 @@ done:
|
|||
mp->m_logbufs != 0 &&
|
||||
(mp->m_logbufs < XLOG_MIN_ICLOGS ||
|
||||
mp->m_logbufs > XLOG_MAX_ICLOGS)) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: invalid logbufs value: %d [not %d-%d]",
|
||||
xfs_warn(mp, "invalid logbufs value: %d [not %d-%d]",
|
||||
mp->m_logbufs, XLOG_MIN_ICLOGS, XLOG_MAX_ICLOGS);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
@ -448,22 +443,16 @@ done:
|
|||
(mp->m_logbsize < XLOG_MIN_RECORD_BSIZE ||
|
||||
mp->m_logbsize > XLOG_MAX_RECORD_BSIZE ||
|
||||
!is_power_of_2(mp->m_logbsize))) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: invalid logbufsize: %d [not 16k,32k,64k,128k or 256k]",
|
||||
xfs_warn(mp,
|
||||
"invalid logbufsize: %d [not 16k,32k,64k,128k or 256k]",
|
||||
mp->m_logbsize);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
mp->m_fsname = kstrndup(sb->s_id, MAXNAMELEN, GFP_KERNEL);
|
||||
if (!mp->m_fsname)
|
||||
return ENOMEM;
|
||||
mp->m_fsname_len = strlen(mp->m_fsname) + 1;
|
||||
|
||||
if (iosizelog) {
|
||||
if (iosizelog > XFS_MAX_IO_LOG ||
|
||||
iosizelog < XFS_MIN_IO_LOG) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: invalid log iosize: %d [not %d-%d]",
|
||||
xfs_warn(mp, "invalid log iosize: %d [not %d-%d]",
|
||||
iosizelog, XFS_MIN_IO_LOG,
|
||||
XFS_MAX_IO_LOG);
|
||||
return XFS_ERROR(EINVAL);
|
||||
|
@ -610,7 +599,7 @@ xfs_blkdev_get(
|
|||
mp);
|
||||
if (IS_ERR(*bdevp)) {
|
||||
error = PTR_ERR(*bdevp);
|
||||
printk("XFS: Invalid device [%s], error=%d\n", name, error);
|
||||
xfs_warn(mp, "Invalid device [%s], error=%d\n", name, error);
|
||||
}
|
||||
|
||||
return -error;
|
||||
|
@ -664,23 +653,23 @@ xfs_mountfs_check_barriers(xfs_mount_t *mp)
|
|||
int error;
|
||||
|
||||
if (mp->m_logdev_targp != mp->m_ddev_targp) {
|
||||
xfs_fs_cmn_err(CE_NOTE, mp,
|
||||
xfs_notice(mp,
|
||||
"Disabling barriers, not supported with external log device");
|
||||
mp->m_flags &= ~XFS_MOUNT_BARRIER;
|
||||
return;
|
||||
}
|
||||
|
||||
if (xfs_readonly_buftarg(mp->m_ddev_targp)) {
|
||||
xfs_fs_cmn_err(CE_NOTE, mp,
|
||||
"Disabling barriers, underlying device is readonly");
|
||||
xfs_notice(mp,
|
||||
"Disabling barriers, underlying device is readonly");
|
||||
mp->m_flags &= ~XFS_MOUNT_BARRIER;
|
||||
return;
|
||||
}
|
||||
|
||||
error = xfs_barrier_test(mp);
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_NOTE, mp,
|
||||
"Disabling barriers, trial barrier write failed");
|
||||
xfs_notice(mp,
|
||||
"Disabling barriers, trial barrier write failed");
|
||||
mp->m_flags &= ~XFS_MOUNT_BARRIER;
|
||||
return;
|
||||
}
|
||||
|
@ -743,8 +732,8 @@ xfs_open_devices(
|
|||
goto out_close_logdev;
|
||||
|
||||
if (rtdev == ddev || rtdev == logdev) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: Cannot mount filesystem with identical rtdev and ddev/logdev.");
|
||||
xfs_warn(mp,
|
||||
"Cannot mount filesystem with identical rtdev and ddev/logdev.");
|
||||
error = EINVAL;
|
||||
goto out_close_rtdev;
|
||||
}
|
||||
|
@ -1345,8 +1334,8 @@ xfs_fs_remount(
|
|||
* options that we can't actually change.
|
||||
*/
|
||||
#if 0
|
||||
printk(KERN_INFO
|
||||
"XFS: mount option \"%s\" not supported for remount\n", p);
|
||||
xfs_info(mp,
|
||||
"mount option \"%s\" not supported for remount\n", p);
|
||||
return -EINVAL;
|
||||
#else
|
||||
break;
|
||||
|
@ -1367,8 +1356,7 @@ xfs_fs_remount(
|
|||
if (mp->m_update_flags) {
|
||||
error = xfs_mount_log_sb(mp, mp->m_update_flags);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: failed to write sb changes");
|
||||
xfs_warn(mp, "failed to write sb changes");
|
||||
return error;
|
||||
}
|
||||
mp->m_update_flags = 0;
|
||||
|
@ -1452,15 +1440,15 @@ xfs_finish_flags(
|
|||
mp->m_logbsize = mp->m_sb.sb_logsunit;
|
||||
} else if (mp->m_logbsize > 0 &&
|
||||
mp->m_logbsize < mp->m_sb.sb_logsunit) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: logbuf size must be greater than or equal to log stripe size");
|
||||
xfs_warn(mp,
|
||||
"logbuf size must be greater than or equal to log stripe size");
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
} else {
|
||||
/* Fail a mount if the logbuf is larger than 32K */
|
||||
if (mp->m_logbsize > XLOG_BIG_RECORD_BSIZE) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: logbuf size for version 1 logs must be 16K or 32K");
|
||||
xfs_warn(mp,
|
||||
"logbuf size for version 1 logs must be 16K or 32K");
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
}
|
||||
|
@ -1477,8 +1465,8 @@ xfs_finish_flags(
|
|||
* prohibit r/w mounts of read-only filesystems
|
||||
*/
|
||||
if ((mp->m_sb.sb_flags & XFS_SBF_READONLY) && !ronly) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: cannot mount a read-only filesystem as read-write");
|
||||
xfs_warn(mp,
|
||||
"cannot mount a read-only filesystem as read-write");
|
||||
return XFS_ERROR(EROFS);
|
||||
}
|
||||
|
||||
|
|
|
@ -425,8 +425,7 @@ xfs_quiesce_attr(
|
|||
/* Push the superblock and write an unmount record */
|
||||
error = xfs_log_sbcount(mp, 1);
|
||||
if (error)
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"xfs_attr_quiesce: failed to log sb changes. "
|
||||
xfs_warn(mp, "xfs_attr_quiesce: failed to log sb changes. "
|
||||
"Frozen image may not be consistent.");
|
||||
xfs_log_unmount_write(mp);
|
||||
xfs_unmountfs_writesb(mp);
|
||||
|
@ -806,7 +805,7 @@ xfs_reclaim_inode(
|
|||
* pass on the error.
|
||||
*/
|
||||
if (error && error != EAGAIN && !XFS_FORCED_SHUTDOWN(ip->i_mount)) {
|
||||
xfs_fs_cmn_err(CE_WARN, ip->i_mount,
|
||||
xfs_warn(ip->i_mount,
|
||||
"inode 0x%llx background reclaim flush failed with %d",
|
||||
(long long)ip->i_ino, error);
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ xfs_stats_clear_proc_handler(
|
|||
ret = proc_dointvec_minmax(ctl, write, buffer, lenp, ppos);
|
||||
|
||||
if (!ret && write && *valp) {
|
||||
printk("XFS Clearing xfsstats\n");
|
||||
xfs_notice(NULL, "Clearing xfsstats");
|
||||
for_each_possible_cpu(c) {
|
||||
preempt_disable();
|
||||
/* save vn_active, it's a universal truth! */
|
||||
|
|
|
@ -544,9 +544,10 @@ xfs_qm_dqtobp(
|
|||
/*
|
||||
* A simple sanity check in case we got a corrupted dquot...
|
||||
*/
|
||||
if (xfs_qm_dqcheck(ddq, id, dqp->dq_flags & XFS_DQ_ALLTYPES,
|
||||
error = xfs_qm_dqcheck(mp, ddq, id, dqp->dq_flags & XFS_DQ_ALLTYPES,
|
||||
flags & (XFS_QMOPT_DQREPAIR|XFS_QMOPT_DOWARN),
|
||||
"dqtobp")) {
|
||||
"dqtobp");
|
||||
if (error) {
|
||||
if (!(flags & XFS_QMOPT_DQREPAIR)) {
|
||||
xfs_trans_brelse(tp, bp);
|
||||
return XFS_ERROR(EIO);
|
||||
|
@ -827,7 +828,7 @@ xfs_qm_dqget(
|
|||
if (xfs_do_dqerror) {
|
||||
if ((xfs_dqerror_target == mp->m_ddev_targp) &&
|
||||
(xfs_dqreq_num++ % xfs_dqerror_mod) == 0) {
|
||||
cmn_err(CE_DEBUG, "Returning error in dqget");
|
||||
xfs_debug(mp, "Returning error in dqget");
|
||||
return (EIO);
|
||||
}
|
||||
}
|
||||
|
@ -1207,8 +1208,9 @@ xfs_qm_dqflush(
|
|||
/*
|
||||
* A simple sanity check in case we got a corrupted dquot..
|
||||
*/
|
||||
if (xfs_qm_dqcheck(&dqp->q_core, be32_to_cpu(ddqp->d_id), 0,
|
||||
XFS_QMOPT_DOWARN, "dqflush (incore copy)")) {
|
||||
error = xfs_qm_dqcheck(mp, &dqp->q_core, be32_to_cpu(ddqp->d_id), 0,
|
||||
XFS_QMOPT_DOWARN, "dqflush (incore copy)");
|
||||
if (error) {
|
||||
xfs_buf_relse(bp);
|
||||
xfs_dqfunlock(dqp);
|
||||
xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
|
||||
|
@ -1391,8 +1393,8 @@ xfs_qm_dqpurge(
|
|||
*/
|
||||
error = xfs_qm_dqflush(dqp, SYNC_WAIT);
|
||||
if (error)
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"xfs_qm_dqpurge: dquot %p flush failed", dqp);
|
||||
xfs_warn(mp, "%s: dquot %p flush failed",
|
||||
__func__, dqp);
|
||||
xfs_dqflock(dqp);
|
||||
}
|
||||
ASSERT(atomic_read(&dqp->q_pincount) == 0);
|
||||
|
@ -1425,36 +1427,38 @@ xfs_qm_dqpurge(
|
|||
void
|
||||
xfs_qm_dqprint(xfs_dquot_t *dqp)
|
||||
{
|
||||
cmn_err(CE_DEBUG, "-----------KERNEL DQUOT----------------");
|
||||
cmn_err(CE_DEBUG, "---- dquotID = %d",
|
||||
struct xfs_mount *mp = dqp->q_mount;
|
||||
|
||||
xfs_debug(mp, "-----------KERNEL DQUOT----------------");
|
||||
xfs_debug(mp, "---- dquotID = %d",
|
||||
(int)be32_to_cpu(dqp->q_core.d_id));
|
||||
cmn_err(CE_DEBUG, "---- type = %s", DQFLAGTO_TYPESTR(dqp));
|
||||
cmn_err(CE_DEBUG, "---- fs = 0x%p", dqp->q_mount);
|
||||
cmn_err(CE_DEBUG, "---- blkno = 0x%x", (int) dqp->q_blkno);
|
||||
cmn_err(CE_DEBUG, "---- boffset = 0x%x", (int) dqp->q_bufoffset);
|
||||
cmn_err(CE_DEBUG, "---- blkhlimit = %Lu (0x%x)",
|
||||
xfs_debug(mp, "---- type = %s", DQFLAGTO_TYPESTR(dqp));
|
||||
xfs_debug(mp, "---- fs = 0x%p", dqp->q_mount);
|
||||
xfs_debug(mp, "---- blkno = 0x%x", (int) dqp->q_blkno);
|
||||
xfs_debug(mp, "---- boffset = 0x%x", (int) dqp->q_bufoffset);
|
||||
xfs_debug(mp, "---- blkhlimit = %Lu (0x%x)",
|
||||
be64_to_cpu(dqp->q_core.d_blk_hardlimit),
|
||||
(int)be64_to_cpu(dqp->q_core.d_blk_hardlimit));
|
||||
cmn_err(CE_DEBUG, "---- blkslimit = %Lu (0x%x)",
|
||||
xfs_debug(mp, "---- blkslimit = %Lu (0x%x)",
|
||||
be64_to_cpu(dqp->q_core.d_blk_softlimit),
|
||||
(int)be64_to_cpu(dqp->q_core.d_blk_softlimit));
|
||||
cmn_err(CE_DEBUG, "---- inohlimit = %Lu (0x%x)",
|
||||
xfs_debug(mp, "---- inohlimit = %Lu (0x%x)",
|
||||
be64_to_cpu(dqp->q_core.d_ino_hardlimit),
|
||||
(int)be64_to_cpu(dqp->q_core.d_ino_hardlimit));
|
||||
cmn_err(CE_DEBUG, "---- inoslimit = %Lu (0x%x)",
|
||||
xfs_debug(mp, "---- inoslimit = %Lu (0x%x)",
|
||||
be64_to_cpu(dqp->q_core.d_ino_softlimit),
|
||||
(int)be64_to_cpu(dqp->q_core.d_ino_softlimit));
|
||||
cmn_err(CE_DEBUG, "---- bcount = %Lu (0x%x)",
|
||||
xfs_debug(mp, "---- bcount = %Lu (0x%x)",
|
||||
be64_to_cpu(dqp->q_core.d_bcount),
|
||||
(int)be64_to_cpu(dqp->q_core.d_bcount));
|
||||
cmn_err(CE_DEBUG, "---- icount = %Lu (0x%x)",
|
||||
xfs_debug(mp, "---- icount = %Lu (0x%x)",
|
||||
be64_to_cpu(dqp->q_core.d_icount),
|
||||
(int)be64_to_cpu(dqp->q_core.d_icount));
|
||||
cmn_err(CE_DEBUG, "---- btimer = %d",
|
||||
xfs_debug(mp, "---- btimer = %d",
|
||||
(int)be32_to_cpu(dqp->q_core.d_btimer));
|
||||
cmn_err(CE_DEBUG, "---- itimer = %d",
|
||||
xfs_debug(mp, "---- itimer = %d",
|
||||
(int)be32_to_cpu(dqp->q_core.d_itimer));
|
||||
cmn_err(CE_DEBUG, "---------------------------");
|
||||
xfs_debug(mp, "---------------------------");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -136,9 +136,8 @@ xfs_qm_dquot_logitem_push(
|
|||
*/
|
||||
error = xfs_qm_dqflush(dqp, 0);
|
||||
if (error)
|
||||
xfs_fs_cmn_err(CE_WARN, dqp->q_mount,
|
||||
"xfs_qm_dquot_logitem_push: push error %d on dqp %p",
|
||||
error, dqp);
|
||||
xfs_warn(dqp->q_mount, "%s: push error %d on dqp %p",
|
||||
__func__, error, dqp);
|
||||
xfs_dqunlock(dqp);
|
||||
}
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ xfs_qm_dquot_list_print(
|
|||
int i = 0;
|
||||
|
||||
list_for_each_entry(dqp, &mp->m_quotainfo->qi_dqlist_lock, qi_mplist) {
|
||||
cmn_err(CE_DEBUG, " %d. \"%d (%s)\" "
|
||||
xfs_debug(mp, " %d. \"%d (%s)\" "
|
||||
"bcnt = %lld, icnt = %lld, refs = %d",
|
||||
i++, be32_to_cpu(dqp->q_core.d_id),
|
||||
DQFLAGTO_TYPESTR(dqp),
|
||||
|
@ -205,7 +205,7 @@ xfs_qm_destroy(
|
|||
list_for_each_entry_safe(dqp, n, &xqm->qm_dqfrlist, q_freelist) {
|
||||
xfs_dqlock(dqp);
|
||||
#ifdef QUOTADEBUG
|
||||
cmn_err(CE_DEBUG, "FREELIST destroy 0x%p", dqp);
|
||||
xfs_debug(dqp->q_mount, "FREELIST destroy 0x%p", dqp);
|
||||
#endif
|
||||
list_del_init(&dqp->q_freelist);
|
||||
xfs_Gqm->qm_dqfrlist_cnt--;
|
||||
|
@ -341,9 +341,7 @@ xfs_qm_mount_quotas(
|
|||
* quotas immediately.
|
||||
*/
|
||||
if (mp->m_sb.sb_rextents) {
|
||||
cmn_err(CE_NOTE,
|
||||
"Cannot turn on quotas for realtime filesystem %s",
|
||||
mp->m_fsname);
|
||||
xfs_notice(mp, "Cannot turn on quotas for realtime filesystem");
|
||||
mp->m_qflags = 0;
|
||||
goto write_changes;
|
||||
}
|
||||
|
@ -402,14 +400,13 @@ xfs_qm_mount_quotas(
|
|||
* off, but the on disk superblock doesn't know that !
|
||||
*/
|
||||
ASSERT(!(XFS_IS_QUOTA_RUNNING(mp)));
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"XFS mount_quotas: Superblock update failed!");
|
||||
xfs_alert(mp, "%s: Superblock update failed!",
|
||||
__func__);
|
||||
}
|
||||
}
|
||||
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"Failed to initialize disk quotas.");
|
||||
xfs_warn(mp, "Failed to initialize disk quotas.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1229,13 +1226,6 @@ xfs_qm_qino_alloc(
|
|||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Keep an extra reference to this quota inode. This inode is
|
||||
* locked exclusively and joined to the transaction already.
|
||||
*/
|
||||
ASSERT(xfs_isilocked(*ip, XFS_ILOCK_EXCL));
|
||||
IHOLD(*ip);
|
||||
|
||||
/*
|
||||
* Make the changes in the superblock, and log those too.
|
||||
* sbfields arg may contain fields other than *QUOTINO;
|
||||
|
@ -1264,7 +1254,7 @@ xfs_qm_qino_alloc(
|
|||
xfs_mod_sb(tp, sbfields);
|
||||
|
||||
if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES))) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp, "XFS qino_alloc failed!");
|
||||
xfs_alert(mp, "%s failed (error %d)!", __func__, error);
|
||||
return error;
|
||||
}
|
||||
return 0;
|
||||
|
@ -1299,7 +1289,7 @@ xfs_qm_reset_dqcounts(
|
|||
* output any warnings because it's perfectly possible to
|
||||
* find uninitialised dquot blks. See comment in xfs_qm_dqcheck.
|
||||
*/
|
||||
(void) xfs_qm_dqcheck(ddq, id+j, type, XFS_QMOPT_DQREPAIR,
|
||||
(void) xfs_qm_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR,
|
||||
"xfs_quotacheck");
|
||||
ddq->d_bcount = 0;
|
||||
ddq->d_icount = 0;
|
||||
|
@ -1676,7 +1666,7 @@ xfs_qm_quotacheck(
|
|||
*/
|
||||
ASSERT(list_empty(&mp->m_quotainfo->qi_dqlist));
|
||||
|
||||
cmn_err(CE_NOTE, "XFS quotacheck %s: Please wait.", mp->m_fsname);
|
||||
xfs_notice(mp, "Quotacheck needed: Please wait.");
|
||||
|
||||
/*
|
||||
* First we go thru all the dquots on disk, USR and GRP/PRJ, and reset
|
||||
|
@ -1754,9 +1744,9 @@ xfs_qm_quotacheck(
|
|||
|
||||
error_return:
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS quotacheck %s: Unsuccessful (Error %d): "
|
||||
"Disabling quotas.",
|
||||
mp->m_fsname, error);
|
||||
xfs_warn(mp,
|
||||
"Quotacheck: Unsuccessful (Error %d): Disabling quotas.",
|
||||
error);
|
||||
/*
|
||||
* We must turn off quotas.
|
||||
*/
|
||||
|
@ -1764,12 +1754,11 @@ xfs_qm_quotacheck(
|
|||
ASSERT(xfs_Gqm != NULL);
|
||||
xfs_qm_destroy_quotainfo(mp);
|
||||
if (xfs_mount_reset_sbqflags(mp)) {
|
||||
cmn_err(CE_WARN, "XFS quotacheck %s: "
|
||||
"Failed to reset quota flags.", mp->m_fsname);
|
||||
xfs_warn(mp,
|
||||
"Quotacheck: Failed to reset quota flags.");
|
||||
}
|
||||
} else {
|
||||
cmn_err(CE_NOTE, "XFS quotacheck %s: Done.", mp->m_fsname);
|
||||
}
|
||||
} else
|
||||
xfs_notice(mp, "Quotacheck: Done.");
|
||||
return (error);
|
||||
}
|
||||
|
||||
|
@ -1937,8 +1926,8 @@ again:
|
|||
*/
|
||||
error = xfs_qm_dqflush(dqp, 0);
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"xfs_qm_dqreclaim: dquot %p flush failed", dqp);
|
||||
xfs_warn(mp, "%s: dquot %p flush failed",
|
||||
__func__, dqp);
|
||||
}
|
||||
goto dqunlock;
|
||||
}
|
||||
|
@ -2115,7 +2104,7 @@ xfs_qm_write_sb_changes(
|
|||
int error;
|
||||
|
||||
#ifdef QUOTADEBUG
|
||||
cmn_err(CE_NOTE, "Writing superblock quota changes :%s", mp->m_fsname);
|
||||
xfs_notice(mp, "Writing superblock quota changes");
|
||||
#endif
|
||||
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
|
||||
if ((error = xfs_trans_reserve(tp, 0,
|
||||
|
|
|
@ -119,8 +119,7 @@ xfs_qm_newmount(
|
|||
(gquotaondisk && !XFS_IS_GQUOTA_ON(mp)) ||
|
||||
(!gquotaondisk && XFS_IS_OQUOTA_ON(mp))) &&
|
||||
xfs_dev_is_read_only(mp, "changing quota state")) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: please mount with%s%s%s%s.",
|
||||
xfs_warn(mp, "please mount with%s%s%s%s.",
|
||||
(!quotaondisk ? "out quota" : ""),
|
||||
(uquotaondisk ? " usrquota" : ""),
|
||||
(pquotaondisk ? " prjquota" : ""),
|
||||
|
|
|
@ -41,12 +41,6 @@
|
|||
#include "xfs_qm.h"
|
||||
#include "xfs_trace.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
# define qdprintk(s, args...) cmn_err(CE_DEBUG, s, ## args)
|
||||
#else
|
||||
# define qdprintk(s, args...) do { } while (0)
|
||||
#endif
|
||||
|
||||
STATIC int xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint);
|
||||
STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *,
|
||||
uint);
|
||||
|
@ -294,7 +288,8 @@ xfs_qm_scall_trunc_qfiles(
|
|||
int error = 0, error2 = 0;
|
||||
|
||||
if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0) {
|
||||
qdprintk("qtrunc flags=%x m_qflags=%x\n", flags, mp->m_qflags);
|
||||
xfs_debug(mp, "%s: flags=%x m_qflags=%x\n",
|
||||
__func__, flags, mp->m_qflags);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
|
@ -331,7 +326,8 @@ xfs_qm_scall_quotaon(
|
|||
sbflags = 0;
|
||||
|
||||
if (flags == 0) {
|
||||
qdprintk("quotaon: zero flags, m_qflags=%x\n", mp->m_qflags);
|
||||
xfs_debug(mp, "%s: zero flags, m_qflags=%x\n",
|
||||
__func__, mp->m_qflags);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
|
@ -352,8 +348,9 @@ xfs_qm_scall_quotaon(
|
|||
(flags & XFS_GQUOTA_ACCT) == 0 &&
|
||||
(mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 &&
|
||||
(flags & XFS_OQUOTA_ENFD))) {
|
||||
qdprintk("Can't enforce without acct, flags=%x sbflags=%x\n",
|
||||
flags, mp->m_sb.sb_qflags);
|
||||
xfs_debug(mp,
|
||||
"%s: Can't enforce without acct, flags=%x sbflags=%x\n",
|
||||
__func__, flags, mp->m_sb.sb_qflags);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
/*
|
||||
|
@ -541,7 +538,7 @@ xfs_qm_scall_setqlim(
|
|||
q->qi_bsoftlimit = soft;
|
||||
}
|
||||
} else {
|
||||
qdprintk("blkhard %Ld < blksoft %Ld\n", hard, soft);
|
||||
xfs_debug(mp, "blkhard %Ld < blksoft %Ld\n", hard, soft);
|
||||
}
|
||||
hard = (newlim->d_fieldmask & FS_DQ_RTBHARD) ?
|
||||
(xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_rtb_hardlimit) :
|
||||
|
@ -557,7 +554,7 @@ xfs_qm_scall_setqlim(
|
|||
q->qi_rtbsoftlimit = soft;
|
||||
}
|
||||
} else {
|
||||
qdprintk("rtbhard %Ld < rtbsoft %Ld\n", hard, soft);
|
||||
xfs_debug(mp, "rtbhard %Ld < rtbsoft %Ld\n", hard, soft);
|
||||
}
|
||||
|
||||
hard = (newlim->d_fieldmask & FS_DQ_IHARD) ?
|
||||
|
@ -574,7 +571,7 @@ xfs_qm_scall_setqlim(
|
|||
q->qi_isoftlimit = soft;
|
||||
}
|
||||
} else {
|
||||
qdprintk("ihard %Ld < isoft %Ld\n", hard, soft);
|
||||
xfs_debug(mp, "ihard %Ld < isoft %Ld\n", hard, soft);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -939,10 +936,11 @@ struct mutex qcheck_lock;
|
|||
#define DQTEST_LIST_PRINT(l, NXT, title) \
|
||||
{ \
|
||||
xfs_dqtest_t *dqp; int i = 0;\
|
||||
cmn_err(CE_DEBUG, "%s (#%d)", title, (int) (l)->qh_nelems); \
|
||||
xfs_debug(NULL, "%s (#%d)", title, (int) (l)->qh_nelems); \
|
||||
for (dqp = (xfs_dqtest_t *)(l)->qh_next; dqp != NULL; \
|
||||
dqp = (xfs_dqtest_t *)dqp->NXT) { \
|
||||
cmn_err(CE_DEBUG, " %d. \"%d (%s)\" bcnt = %d, icnt = %d", \
|
||||
xfs_debug(dqp->q_mount, \
|
||||
" %d. \"%d (%s)\" bcnt = %d, icnt = %d", \
|
||||
++i, dqp->d_id, DQFLAGTO_TYPESTR(dqp), \
|
||||
dqp->d_bcount, dqp->d_icount); } \
|
||||
}
|
||||
|
@ -966,16 +964,17 @@ xfs_qm_hashinsert(xfs_dqhash_t *h, xfs_dqtest_t *dqp)
|
|||
}
|
||||
STATIC void
|
||||
xfs_qm_dqtest_print(
|
||||
xfs_dqtest_t *d)
|
||||
struct xfs_mount *mp,
|
||||
struct dqtest *d)
|
||||
{
|
||||
cmn_err(CE_DEBUG, "-----------DQTEST DQUOT----------------");
|
||||
cmn_err(CE_DEBUG, "---- dquot ID = %d", d->d_id);
|
||||
cmn_err(CE_DEBUG, "---- fs = 0x%p", d->q_mount);
|
||||
cmn_err(CE_DEBUG, "---- bcount = %Lu (0x%x)",
|
||||
xfs_debug(mp, "-----------DQTEST DQUOT----------------");
|
||||
xfs_debug(mp, "---- dquot ID = %d", d->d_id);
|
||||
xfs_debug(mp, "---- fs = 0x%p", d->q_mount);
|
||||
xfs_debug(mp, "---- bcount = %Lu (0x%x)",
|
||||
d->d_bcount, (int)d->d_bcount);
|
||||
cmn_err(CE_DEBUG, "---- icount = %Lu (0x%x)",
|
||||
xfs_debug(mp, "---- icount = %Lu (0x%x)",
|
||||
d->d_icount, (int)d->d_icount);
|
||||
cmn_err(CE_DEBUG, "---------------------------");
|
||||
xfs_debug(mp, "---------------------------");
|
||||
}
|
||||
|
||||
STATIC void
|
||||
|
@ -989,12 +988,14 @@ xfs_qm_dqtest_failed(
|
|||
{
|
||||
qmtest_nfails++;
|
||||
if (error)
|
||||
cmn_err(CE_DEBUG, "quotacheck failed id=%d, err=%d\nreason: %s",
|
||||
d->d_id, error, reason);
|
||||
xfs_debug(dqp->q_mount,
|
||||
"quotacheck failed id=%d, err=%d\nreason: %s",
|
||||
d->d_id, error, reason);
|
||||
else
|
||||
cmn_err(CE_DEBUG, "quotacheck failed id=%d (%s) [%d != %d]",
|
||||
d->d_id, reason, (int)a, (int)b);
|
||||
xfs_qm_dqtest_print(d);
|
||||
xfs_debug(dqp->q_mount,
|
||||
"quotacheck failed id=%d (%s) [%d != %d]",
|
||||
d->d_id, reason, (int)a, (int)b);
|
||||
xfs_qm_dqtest_print(dqp->q_mount, d);
|
||||
if (dqp)
|
||||
xfs_qm_dqprint(dqp);
|
||||
}
|
||||
|
@ -1021,9 +1022,9 @@ xfs_dqtest_cmp2(
|
|||
be64_to_cpu(dqp->q_core.d_bcount) >=
|
||||
be64_to_cpu(dqp->q_core.d_blk_softlimit)) {
|
||||
if (!dqp->q_core.d_btimer && dqp->q_core.d_id) {
|
||||
cmn_err(CE_DEBUG,
|
||||
"%d [%s] [0x%p] BLK TIMER NOT STARTED",
|
||||
d->d_id, DQFLAGTO_TYPESTR(d), d->q_mount);
|
||||
xfs_debug(dqp->q_mount,
|
||||
"%d [%s] BLK TIMER NOT STARTED",
|
||||
d->d_id, DQFLAGTO_TYPESTR(d));
|
||||
err++;
|
||||
}
|
||||
}
|
||||
|
@ -1031,16 +1032,16 @@ xfs_dqtest_cmp2(
|
|||
be64_to_cpu(dqp->q_core.d_icount) >=
|
||||
be64_to_cpu(dqp->q_core.d_ino_softlimit)) {
|
||||
if (!dqp->q_core.d_itimer && dqp->q_core.d_id) {
|
||||
cmn_err(CE_DEBUG,
|
||||
"%d [%s] [0x%p] INO TIMER NOT STARTED",
|
||||
d->d_id, DQFLAGTO_TYPESTR(d), d->q_mount);
|
||||
xfs_debug(dqp->q_mount,
|
||||
"%d [%s] INO TIMER NOT STARTED",
|
||||
d->d_id, DQFLAGTO_TYPESTR(d));
|
||||
err++;
|
||||
}
|
||||
}
|
||||
#ifdef QUOTADEBUG
|
||||
if (!err) {
|
||||
cmn_err(CE_DEBUG, "%d [%s] [0x%p] qchecked",
|
||||
d->d_id, DQFLAGTO_TYPESTR(d), d->q_mount);
|
||||
xfs_debug(dqp->q_mount, "%d [%s] qchecked",
|
||||
d->d_id, DQFLAGTO_TYPESTR(d));
|
||||
}
|
||||
#endif
|
||||
return (err);
|
||||
|
@ -1137,8 +1138,8 @@ xfs_qm_internalqcheck_adjust(
|
|||
|
||||
if (ino == mp->m_sb.sb_uquotino || ino == mp->m_sb.sb_gquotino) {
|
||||
*res = BULKSTAT_RV_NOTHING;
|
||||
qdprintk("internalqcheck: ino=%llu, uqino=%llu, gqino=%llu\n",
|
||||
(unsigned long long) ino,
|
||||
xfs_debug(mp, "%s: ino=%llu, uqino=%llu, gqino=%llu\n",
|
||||
__func__, (unsigned long long) ino,
|
||||
(unsigned long long) mp->m_sb.sb_uquotino,
|
||||
(unsigned long long) mp->m_sb.sb_gquotino);
|
||||
return XFS_ERROR(EINVAL);
|
||||
|
@ -1223,12 +1224,12 @@ xfs_qm_internalqcheck(
|
|||
xfs_qm_internalqcheck_adjust,
|
||||
0, NULL, &done);
|
||||
if (error) {
|
||||
cmn_err(CE_DEBUG, "Bulkstat returned error 0x%x", error);
|
||||
xfs_debug(mp, "Bulkstat returned error 0x%x", error);
|
||||
break;
|
||||
}
|
||||
} while (!done);
|
||||
|
||||
cmn_err(CE_DEBUG, "Checking results against system dquots");
|
||||
xfs_debug(mp, "Checking results against system dquots");
|
||||
for (i = 0; i < qmtest_hashmask; i++) {
|
||||
xfs_dqtest_t *d, *n;
|
||||
xfs_dqhash_t *h;
|
||||
|
@ -1246,10 +1247,10 @@ xfs_qm_internalqcheck(
|
|||
}
|
||||
|
||||
if (qmtest_nfails) {
|
||||
cmn_err(CE_DEBUG, "******** quotacheck failed ********");
|
||||
cmn_err(CE_DEBUG, "failures = %d", qmtest_nfails);
|
||||
xfs_debug(mp, "******** quotacheck failed ********");
|
||||
xfs_debug(mp, "failures = %d", qmtest_nfails);
|
||||
} else {
|
||||
cmn_err(CE_DEBUG, "******** quotacheck successful! ********");
|
||||
xfs_debug(mp, "******** quotacheck successful! ********");
|
||||
}
|
||||
kmem_free(qmtest_udqtab);
|
||||
kmem_free(qmtest_gdqtab);
|
||||
|
|
|
@ -643,8 +643,9 @@ xfs_trans_dqresv(
|
|||
(XFS_IS_OQUOTA_ENFORCED(dqp->q_mount) &&
|
||||
(XFS_QM_ISPDQ(dqp) || XFS_QM_ISGDQ(dqp))))) {
|
||||
#ifdef QUOTADEBUG
|
||||
cmn_err(CE_DEBUG, "BLK Res: nblks=%ld + resbcount=%Ld"
|
||||
" > hardlimit=%Ld?", nblks, *resbcountp, hardlimit);
|
||||
xfs_debug(mp,
|
||||
"BLK Res: nblks=%ld + resbcount=%Ld > hardlimit=%Ld?",
|
||||
nblks, *resbcountp, hardlimit);
|
||||
#endif
|
||||
if (nblks > 0) {
|
||||
/*
|
||||
|
|
|
@ -1,107 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it would be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#include <xfs.h>
|
||||
#include "debug.h"
|
||||
|
||||
/* xfs_mount.h drags a lot of crap in, sorry.. */
|
||||
#include "xfs_sb.h"
|
||||
#include "xfs_inum.h"
|
||||
#include "xfs_ag.h"
|
||||
#include "xfs_mount.h"
|
||||
#include "xfs_error.h"
|
||||
|
||||
void
|
||||
cmn_err(
|
||||
const char *lvl,
|
||||
const char *fmt,
|
||||
...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
printk("%s%pV", lvl, &vaf);
|
||||
va_end(args);
|
||||
|
||||
BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0);
|
||||
}
|
||||
|
||||
void
|
||||
xfs_fs_cmn_err(
|
||||
const char *lvl,
|
||||
struct xfs_mount *mp,
|
||||
const char *fmt,
|
||||
...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
printk("%sFilesystem %s: %pV", lvl, mp->m_fsname, &vaf);
|
||||
va_end(args);
|
||||
|
||||
BUG_ON(strncmp(lvl, KERN_EMERG, strlen(KERN_EMERG)) == 0);
|
||||
}
|
||||
|
||||
/* All callers to xfs_cmn_err use CE_ALERT, so don't bother testing lvl */
|
||||
void
|
||||
xfs_cmn_err(
|
||||
int panic_tag,
|
||||
const char *lvl,
|
||||
struct xfs_mount *mp,
|
||||
const char *fmt,
|
||||
...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
int do_panic = 0;
|
||||
|
||||
if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) {
|
||||
printk(KERN_ALERT "XFS: Transforming an alert into a BUG.");
|
||||
do_panic = 1;
|
||||
}
|
||||
|
||||
va_start(args, fmt);
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
printk(KERN_ALERT "Filesystem %s: %pV", mp->m_fsname, &vaf);
|
||||
va_end(args);
|
||||
|
||||
BUG_ON(do_panic);
|
||||
}
|
||||
|
||||
void
|
||||
assfail(char *expr, char *file, int line)
|
||||
{
|
||||
printk(KERN_CRIT "Assertion failed: %s, file: %s, line: %d\n", expr,
|
||||
file, line);
|
||||
BUG();
|
||||
}
|
||||
|
||||
void
|
||||
xfs_hex_dump(void *p, int length)
|
||||
{
|
||||
print_hex_dump(KERN_ALERT, "", DUMP_PREFIX_ADDRESS, 16, 1, p, length, 1);
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2000-2005 Silicon Graphics, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it would be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#ifndef __XFS_SUPPORT_DEBUG_H__
|
||||
#define __XFS_SUPPORT_DEBUG_H__
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
struct xfs_mount;
|
||||
|
||||
#define CE_DEBUG KERN_DEBUG
|
||||
#define CE_CONT KERN_INFO
|
||||
#define CE_NOTE KERN_NOTICE
|
||||
#define CE_WARN KERN_WARNING
|
||||
#define CE_ALERT KERN_ALERT
|
||||
#define CE_PANIC KERN_EMERG
|
||||
|
||||
void cmn_err(const char *lvl, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
void xfs_fs_cmn_err( const char *lvl, struct xfs_mount *mp,
|
||||
const char *fmt, ...) __attribute__ ((format (printf, 3, 4)));
|
||||
void xfs_cmn_err( int panic_tag, const char *lvl, struct xfs_mount *mp,
|
||||
const char *fmt, ...) __attribute__ ((format (printf, 4, 5)));
|
||||
|
||||
extern void assfail(char *expr, char *f, int l);
|
||||
|
||||
#define ASSERT_ALWAYS(expr) \
|
||||
(unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__))
|
||||
|
||||
#ifndef DEBUG
|
||||
#define ASSERT(expr) ((void)0)
|
||||
|
||||
#ifndef STATIC
|
||||
# define STATIC static noinline
|
||||
#endif
|
||||
|
||||
#else /* DEBUG */
|
||||
|
||||
#define ASSERT(expr) \
|
||||
(unlikely(expr) ? (void)0 : assfail(#expr, __FILE__, __LINE__))
|
||||
|
||||
#ifndef STATIC
|
||||
# define STATIC noinline
|
||||
#endif
|
||||
|
||||
#endif /* DEBUG */
|
||||
#endif /* __XFS_SUPPORT_DEBUG_H__ */
|
|
@ -147,10 +147,9 @@ xfs_alloc_get_rec(
|
|||
*/
|
||||
STATIC void
|
||||
xfs_alloc_compute_aligned(
|
||||
xfs_alloc_arg_t *args, /* allocation argument structure */
|
||||
xfs_agblock_t foundbno, /* starting block in found extent */
|
||||
xfs_extlen_t foundlen, /* length in found extent */
|
||||
xfs_extlen_t alignment, /* alignment for allocation */
|
||||
xfs_extlen_t minlen, /* minimum length for allocation */
|
||||
xfs_agblock_t *resbno, /* result block number */
|
||||
xfs_extlen_t *reslen) /* result length */
|
||||
{
|
||||
|
@ -158,8 +157,8 @@ xfs_alloc_compute_aligned(
|
|||
xfs_extlen_t diff;
|
||||
xfs_extlen_t len;
|
||||
|
||||
if (alignment > 1 && foundlen >= minlen) {
|
||||
bno = roundup(foundbno, alignment);
|
||||
if (args->alignment > 1 && foundlen >= args->minlen) {
|
||||
bno = roundup(foundbno, args->alignment);
|
||||
diff = bno - foundbno;
|
||||
len = diff >= foundlen ? 0 : foundlen - diff;
|
||||
} else {
|
||||
|
@ -464,6 +463,27 @@ xfs_alloc_read_agfl(
|
|||
return 0;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
xfs_alloc_update_counters(
|
||||
struct xfs_trans *tp,
|
||||
struct xfs_perag *pag,
|
||||
struct xfs_buf *agbp,
|
||||
long len)
|
||||
{
|
||||
struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp);
|
||||
|
||||
pag->pagf_freeblks += len;
|
||||
be32_add_cpu(&agf->agf_freeblks, len);
|
||||
|
||||
xfs_trans_agblocks_delta(tp, len);
|
||||
if (unlikely(be32_to_cpu(agf->agf_freeblks) >
|
||||
be32_to_cpu(agf->agf_length)))
|
||||
return EFSCORRUPTED;
|
||||
|
||||
xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocation group level functions.
|
||||
*/
|
||||
|
@ -505,49 +525,44 @@ xfs_alloc_ag_vextent(
|
|||
ASSERT(0);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
if (error)
|
||||
|
||||
if (error || args->agbno == NULLAGBLOCK)
|
||||
return error;
|
||||
/*
|
||||
* If the allocation worked, need to change the agf structure
|
||||
* (and log it), and the superblock.
|
||||
*/
|
||||
if (args->agbno != NULLAGBLOCK) {
|
||||
xfs_agf_t *agf; /* allocation group freelist header */
|
||||
long slen = (long)args->len;
|
||||
|
||||
ASSERT(args->len >= args->minlen && args->len <= args->maxlen);
|
||||
ASSERT(!(args->wasfromfl) || !args->isfl);
|
||||
ASSERT(args->agbno % args->alignment == 0);
|
||||
if (!(args->wasfromfl)) {
|
||||
ASSERT(args->len >= args->minlen);
|
||||
ASSERT(args->len <= args->maxlen);
|
||||
ASSERT(!args->wasfromfl || !args->isfl);
|
||||
ASSERT(args->agbno % args->alignment == 0);
|
||||
|
||||
agf = XFS_BUF_TO_AGF(args->agbp);
|
||||
be32_add_cpu(&agf->agf_freeblks, -(args->len));
|
||||
xfs_trans_agblocks_delta(args->tp,
|
||||
-((long)(args->len)));
|
||||
args->pag->pagf_freeblks -= args->len;
|
||||
ASSERT(be32_to_cpu(agf->agf_freeblks) <=
|
||||
be32_to_cpu(agf->agf_length));
|
||||
xfs_alloc_log_agf(args->tp, args->agbp,
|
||||
XFS_AGF_FREEBLKS);
|
||||
/*
|
||||
* Search the busylist for these blocks and mark the
|
||||
* transaction as synchronous if blocks are found. This
|
||||
* avoids the need to block due to a synchronous log
|
||||
* force to ensure correct ordering as the synchronous
|
||||
* transaction will guarantee that for us.
|
||||
*/
|
||||
if (xfs_alloc_busy_search(args->mp, args->agno,
|
||||
args->agbno, args->len))
|
||||
xfs_trans_set_sync(args->tp);
|
||||
}
|
||||
if (!args->isfl)
|
||||
xfs_trans_mod_sb(args->tp,
|
||||
args->wasdel ? XFS_TRANS_SB_RES_FDBLOCKS :
|
||||
XFS_TRANS_SB_FDBLOCKS, -slen);
|
||||
XFS_STATS_INC(xs_allocx);
|
||||
XFS_STATS_ADD(xs_allocb, args->len);
|
||||
if (!args->wasfromfl) {
|
||||
error = xfs_alloc_update_counters(args->tp, args->pag,
|
||||
args->agbp,
|
||||
-((long)(args->len)));
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/*
|
||||
* Search the busylist for these blocks and mark the
|
||||
* transaction as synchronous if blocks are found. This
|
||||
* avoids the need to block due to a synchronous log
|
||||
* force to ensure correct ordering as the synchronous
|
||||
* transaction will guarantee that for us.
|
||||
*/
|
||||
if (xfs_alloc_busy_search(args->mp, args->agno,
|
||||
args->agbno, args->len))
|
||||
xfs_trans_set_sync(args->tp);
|
||||
}
|
||||
return 0;
|
||||
|
||||
if (!args->isfl) {
|
||||
xfs_trans_mod_sb(args->tp, args->wasdel ?
|
||||
XFS_TRANS_SB_RES_FDBLOCKS :
|
||||
XFS_TRANS_SB_FDBLOCKS,
|
||||
-((long)(args->len)));
|
||||
}
|
||||
|
||||
XFS_STATS_INC(xs_allocx);
|
||||
XFS_STATS_ADD(xs_allocb, args->len);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -693,8 +708,7 @@ xfs_alloc_find_best_extent(
|
|||
if (error)
|
||||
goto error0;
|
||||
XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
|
||||
xfs_alloc_compute_aligned(*sbno, *slen, args->alignment,
|
||||
args->minlen, &bno, slena);
|
||||
xfs_alloc_compute_aligned(args, *sbno, *slen, &bno, slena);
|
||||
|
||||
/*
|
||||
* The good extent is closer than this one.
|
||||
|
@ -866,8 +880,8 @@ xfs_alloc_ag_vextent_near(
|
|||
if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i)))
|
||||
goto error0;
|
||||
XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
|
||||
xfs_alloc_compute_aligned(ltbno, ltlen, args->alignment,
|
||||
args->minlen, <bnoa, <lena);
|
||||
xfs_alloc_compute_aligned(args, ltbno, ltlen,
|
||||
<bnoa, <lena);
|
||||
if (ltlena < args->minlen)
|
||||
continue;
|
||||
args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen);
|
||||
|
@ -987,8 +1001,8 @@ xfs_alloc_ag_vextent_near(
|
|||
if ((error = xfs_alloc_get_rec(bno_cur_lt, <bno, <len, &i)))
|
||||
goto error0;
|
||||
XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
|
||||
xfs_alloc_compute_aligned(ltbno, ltlen, args->alignment,
|
||||
args->minlen, <bnoa, <lena);
|
||||
xfs_alloc_compute_aligned(args, ltbno, ltlen,
|
||||
<bnoa, <lena);
|
||||
if (ltlena >= args->minlen)
|
||||
break;
|
||||
if ((error = xfs_btree_decrement(bno_cur_lt, 0, &i)))
|
||||
|
@ -1003,8 +1017,8 @@ xfs_alloc_ag_vextent_near(
|
|||
if ((error = xfs_alloc_get_rec(bno_cur_gt, >bno, >len, &i)))
|
||||
goto error0;
|
||||
XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
|
||||
xfs_alloc_compute_aligned(gtbno, gtlen, args->alignment,
|
||||
args->minlen, >bnoa, >lena);
|
||||
xfs_alloc_compute_aligned(args, gtbno, gtlen,
|
||||
>bnoa, >lena);
|
||||
if (gtlena >= args->minlen)
|
||||
break;
|
||||
if ((error = xfs_btree_increment(bno_cur_gt, 0, &i)))
|
||||
|
@ -1183,8 +1197,7 @@ xfs_alloc_ag_vextent_size(
|
|||
* once aligned; if not, we search left for something better.
|
||||
* This can't happen in the second case above.
|
||||
*/
|
||||
xfs_alloc_compute_aligned(fbno, flen, args->alignment, args->minlen,
|
||||
&rbno, &rlen);
|
||||
xfs_alloc_compute_aligned(args, fbno, flen, &rbno, &rlen);
|
||||
rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
|
||||
XFS_WANT_CORRUPTED_GOTO(rlen == 0 ||
|
||||
(rlen <= flen && rbno + rlen <= fbno + flen), error0);
|
||||
|
@ -1209,8 +1222,8 @@ xfs_alloc_ag_vextent_size(
|
|||
XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
|
||||
if (flen < bestrlen)
|
||||
break;
|
||||
xfs_alloc_compute_aligned(fbno, flen, args->alignment,
|
||||
args->minlen, &rbno, &rlen);
|
||||
xfs_alloc_compute_aligned(args, fbno, flen,
|
||||
&rbno, &rlen);
|
||||
rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
|
||||
XFS_WANT_CORRUPTED_GOTO(rlen == 0 ||
|
||||
(rlen <= flen && rbno + rlen <= fbno + flen),
|
||||
|
@ -1388,6 +1401,7 @@ xfs_free_ag_extent(
|
|||
xfs_mount_t *mp; /* mount point struct for filesystem */
|
||||
xfs_agblock_t nbno; /* new starting block of freespace */
|
||||
xfs_extlen_t nlen; /* new length of freespace */
|
||||
xfs_perag_t *pag; /* per allocation group data */
|
||||
|
||||
mp = tp->t_mountp;
|
||||
/*
|
||||
|
@ -1586,30 +1600,20 @@ xfs_free_ag_extent(
|
|||
XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
|
||||
xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
|
||||
cnt_cur = NULL;
|
||||
|
||||
/*
|
||||
* Update the freespace totals in the ag and superblock.
|
||||
*/
|
||||
{
|
||||
xfs_agf_t *agf;
|
||||
xfs_perag_t *pag; /* per allocation group data */
|
||||
pag = xfs_perag_get(mp, agno);
|
||||
error = xfs_alloc_update_counters(tp, pag, agbp, len);
|
||||
xfs_perag_put(pag);
|
||||
if (error)
|
||||
goto error0;
|
||||
|
||||
pag = xfs_perag_get(mp, agno);
|
||||
pag->pagf_freeblks += len;
|
||||
xfs_perag_put(pag);
|
||||
|
||||
agf = XFS_BUF_TO_AGF(agbp);
|
||||
be32_add_cpu(&agf->agf_freeblks, len);
|
||||
xfs_trans_agblocks_delta(tp, len);
|
||||
XFS_WANT_CORRUPTED_GOTO(
|
||||
be32_to_cpu(agf->agf_freeblks) <=
|
||||
be32_to_cpu(agf->agf_length),
|
||||
error0);
|
||||
xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS);
|
||||
if (!isfl)
|
||||
xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len);
|
||||
XFS_STATS_INC(xs_freex);
|
||||
XFS_STATS_ADD(xs_freeb, len);
|
||||
}
|
||||
if (!isfl)
|
||||
xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len);
|
||||
XFS_STATS_INC(xs_freex);
|
||||
XFS_STATS_ADD(xs_freeb, len);
|
||||
|
||||
trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright);
|
||||
|
||||
|
|
|
@ -2365,6 +2365,13 @@ xfs_bmap_rtalloc(
|
|||
*/
|
||||
if (ralen * mp->m_sb.sb_rextsize >= MAXEXTLEN)
|
||||
ralen = MAXEXTLEN / mp->m_sb.sb_rextsize;
|
||||
|
||||
/*
|
||||
* Lock out other modifications to the RT bitmap inode.
|
||||
*/
|
||||
xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin_ref(ap->tp, mp->m_rbmip, XFS_ILOCK_EXCL);
|
||||
|
||||
/*
|
||||
* If it's an allocation to an empty file at offset 0,
|
||||
* pick an extent that will space things out in the rt area.
|
||||
|
@ -3519,7 +3526,7 @@ xfs_bmap_search_extents(
|
|||
|
||||
if (unlikely(!(gotp->br_startblock) && (*lastxp != NULLEXTNUM) &&
|
||||
!(XFS_IS_REALTIME_INODE(ip) && fork == XFS_DATA_FORK))) {
|
||||
xfs_cmn_err(XFS_PTAG_FSBLOCK_ZERO, CE_ALERT, ip->i_mount,
|
||||
xfs_alert_tag(ip->i_mount, XFS_PTAG_FSBLOCK_ZERO,
|
||||
"Access to block zero in inode %llu "
|
||||
"start_block: %llx start_off: %llx "
|
||||
"blkcnt: %llx extent-state: %x lastx: %x\n",
|
||||
|
@ -4193,12 +4200,11 @@ xfs_bmap_read_extents(
|
|||
num_recs = xfs_btree_get_numrecs(block);
|
||||
if (unlikely(i + num_recs > room)) {
|
||||
ASSERT(i + num_recs <= room);
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
xfs_warn(ip->i_mount,
|
||||
"corrupt dinode %Lu, (btree extents).",
|
||||
(unsigned long long) ip->i_ino);
|
||||
XFS_ERROR_REPORT("xfs_bmap_read_extents(1)",
|
||||
XFS_ERRLEVEL_LOW,
|
||||
ip->i_mount);
|
||||
XFS_CORRUPTION_ERROR("xfs_bmap_read_extents(1)",
|
||||
XFS_ERRLEVEL_LOW, ip->i_mount, block);
|
||||
goto error0;
|
||||
}
|
||||
XFS_WANT_CORRUPTED_GOTO(
|
||||
|
@ -5772,7 +5778,7 @@ xfs_check_block(
|
|||
else
|
||||
thispa = XFS_BMBT_PTR_ADDR(mp, block, j, dmxr);
|
||||
if (*thispa == *pp) {
|
||||
cmn_err(CE_WARN, "%s: thispa(%d) == pp(%d) %Ld",
|
||||
xfs_warn(mp, "%s: thispa(%d) == pp(%d) %Ld",
|
||||
__func__, j, i,
|
||||
(unsigned long long)be64_to_cpu(*thispa));
|
||||
panic("%s: ptrs are equal in node\n",
|
||||
|
@ -5937,11 +5943,11 @@ xfs_bmap_check_leaf_extents(
|
|||
return;
|
||||
|
||||
error0:
|
||||
cmn_err(CE_WARN, "%s: at error0", __func__);
|
||||
xfs_warn(mp, "%s: at error0", __func__);
|
||||
if (bp_release)
|
||||
xfs_trans_brelse(NULL, bp);
|
||||
error_norelse:
|
||||
cmn_err(CE_WARN, "%s: BAD after btree leaves for %d extents",
|
||||
xfs_warn(mp, "%s: BAD after btree leaves for %d extents",
|
||||
__func__, i);
|
||||
panic("%s: CORRUPTED BTREE OR SOMETHING", __func__);
|
||||
return;
|
||||
|
@ -6144,7 +6150,7 @@ xfs_bmap_punch_delalloc_range(
|
|||
if (error) {
|
||||
/* something screwed, just bail */
|
||||
if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) {
|
||||
xfs_fs_cmn_err(CE_ALERT, ip->i_mount,
|
||||
xfs_alert(ip->i_mount,
|
||||
"Failed delalloc mapping lookup ino %lld fsb %lld.",
|
||||
ip->i_ino, start_fsb);
|
||||
}
|
||||
|
|
|
@ -130,10 +130,12 @@ xfs_buf_item_log_check(
|
|||
orig = bip->bli_orig;
|
||||
buffer = XFS_BUF_PTR(bp);
|
||||
for (x = 0; x < XFS_BUF_COUNT(bp); x++) {
|
||||
if (orig[x] != buffer[x] && !btst(bip->bli_logged, x))
|
||||
cmn_err(CE_PANIC,
|
||||
"xfs_buf_item_log_check bip %x buffer %x orig %x index %d",
|
||||
bip, bp, orig, x);
|
||||
if (orig[x] != buffer[x] && !btst(bip->bli_logged, x)) {
|
||||
xfs_emerg(bp->b_mount,
|
||||
"%s: bip %x buffer %x orig %x index %d",
|
||||
__func__, bip, bp, orig, x);
|
||||
ASSERT(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
@ -983,10 +985,9 @@ xfs_buf_iodone_callbacks(
|
|||
if (XFS_BUF_TARGET(bp) != lasttarg ||
|
||||
time_after(jiffies, (lasttime + 5*HZ))) {
|
||||
lasttime = jiffies;
|
||||
cmn_err(CE_ALERT, "Device %s, XFS metadata write error"
|
||||
" block 0x%llx in %s",
|
||||
xfs_alert(mp, "Device %s: metadata write error block 0x%llx",
|
||||
XFS_BUFTARG_NAME(XFS_BUF_TARGET(bp)),
|
||||
(__uint64_t)XFS_BUF_ADDR(bp), mp->m_fsname);
|
||||
(__uint64_t)XFS_BUF_ADDR(bp));
|
||||
}
|
||||
lasttarg = XFS_BUF_TARGET(bp);
|
||||
|
||||
|
|
|
@ -1995,13 +1995,12 @@ xfs_da_do_buf(
|
|||
error = mappedbno == -2 ? 0 : XFS_ERROR(EFSCORRUPTED);
|
||||
if (unlikely(error == EFSCORRUPTED)) {
|
||||
if (xfs_error_level >= XFS_ERRLEVEL_LOW) {
|
||||
cmn_err(CE_ALERT, "xfs_da_do_buf: bno %lld\n",
|
||||
(long long)bno);
|
||||
cmn_err(CE_ALERT, "dir: inode %lld\n",
|
||||
xfs_alert(mp, "%s: bno %lld dir: inode %lld",
|
||||
__func__, (long long)bno,
|
||||
(long long)dp->i_ino);
|
||||
for (i = 0; i < nmap; i++) {
|
||||
cmn_err(CE_ALERT,
|
||||
"[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d\n",
|
||||
xfs_alert(mp,
|
||||
"[%02d] br_startoff %lld br_startblock %lld br_blockcount %lld br_state %d",
|
||||
i,
|
||||
(long long)mapp[i].br_startoff,
|
||||
(long long)mapp[i].br_startblock,
|
||||
|
|
|
@ -270,9 +270,9 @@ xfs_swap_extents(
|
|||
/* check inode formats now that data is flushed */
|
||||
error = xfs_swap_extents_check_format(ip, tip);
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_NOTE, mp,
|
||||
xfs_notice(mp,
|
||||
"%s: inode 0x%llx format is incompatible for exchanging.",
|
||||
__FILE__, ip->i_ino);
|
||||
__func__, ip->i_ino);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ xfs_dir_ino_validate(
|
|||
XFS_AGINO_TO_INO(mp, agno, agino) == ino;
|
||||
if (unlikely(XFS_TEST_ERROR(!ino_ok, mp, XFS_ERRTAG_DIR_INO_VALIDATE,
|
||||
XFS_RANDOM_DIR_INO_VALIDATE))) {
|
||||
xfs_fs_cmn_err(CE_WARN, mp, "Invalid inode number 0x%Lx",
|
||||
xfs_warn(mp, "Invalid inode number 0x%Lx",
|
||||
(unsigned long long) ino);
|
||||
XFS_ERROR_REPORT("xfs_dir_ino_validate", XFS_ERRLEVEL_LOW, mp);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
|
|
|
@ -899,10 +899,9 @@ xfs_dir2_leafn_rebalance(
|
|||
if(blk2->index < 0) {
|
||||
state->inleaf = 1;
|
||||
blk2->index = 0;
|
||||
cmn_err(CE_ALERT,
|
||||
"xfs_dir2_leafn_rebalance: picked the wrong leaf? reverting original leaf: "
|
||||
"blk1->index %d\n",
|
||||
blk1->index);
|
||||
xfs_alert(args->dp->i_mount,
|
||||
"%s: picked the wrong leaf? reverting original leaf: blk1->index %d\n",
|
||||
__func__, blk1->index);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1641,26 +1640,22 @@ xfs_dir2_node_addname_int(
|
|||
}
|
||||
|
||||
if (unlikely(xfs_dir2_db_to_fdb(mp, dbno) != fbno)) {
|
||||
cmn_err(CE_ALERT,
|
||||
"xfs_dir2_node_addname_int: dir ino "
|
||||
"%llu needed freesp block %lld for\n"
|
||||
" data block %lld, got %lld\n"
|
||||
" ifbno %llu lastfbno %d\n",
|
||||
(unsigned long long)dp->i_ino,
|
||||
xfs_alert(mp,
|
||||
"%s: dir ino " "%llu needed freesp block %lld for\n"
|
||||
" data block %lld, got %lld ifbno %llu lastfbno %d",
|
||||
__func__, (unsigned long long)dp->i_ino,
|
||||
(long long)xfs_dir2_db_to_fdb(mp, dbno),
|
||||
(long long)dbno, (long long)fbno,
|
||||
(unsigned long long)ifbno, lastfbno);
|
||||
if (fblk) {
|
||||
cmn_err(CE_ALERT,
|
||||
" fblk 0x%p blkno %llu "
|
||||
"index %d magic 0x%x\n",
|
||||
xfs_alert(mp,
|
||||
" fblk 0x%p blkno %llu index %d magic 0x%x",
|
||||
fblk,
|
||||
(unsigned long long)fblk->blkno,
|
||||
fblk->index,
|
||||
fblk->magic);
|
||||
} else {
|
||||
cmn_err(CE_ALERT,
|
||||
" ... fblk is NULL\n");
|
||||
xfs_alert(mp, " ... fblk is NULL");
|
||||
}
|
||||
XFS_ERROR_REPORT("xfs_dir2_node_addname_int",
|
||||
XFS_ERRLEVEL_LOW, mp);
|
||||
|
|
|
@ -48,7 +48,7 @@ xfs_error_trap(int e)
|
|||
break;
|
||||
if (e != xfs_etrap[i])
|
||||
continue;
|
||||
cmn_err(CE_NOTE, "xfs_error_trap: error %d", e);
|
||||
xfs_notice(NULL, "%s: error %d", __func__, e);
|
||||
BUG();
|
||||
break;
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ xfs_error_test(int error_tag, int *fsidp, char *expression,
|
|||
|
||||
for (i = 0; i < XFS_NUM_INJECT_ERROR; i++) {
|
||||
if (xfs_etest[i] == error_tag && xfs_etest_fsid[i] == fsid) {
|
||||
cmn_err(CE_WARN,
|
||||
xfs_warn(NULL,
|
||||
"Injecting error (%s) at file %s, line %d, on filesystem \"%s\"",
|
||||
expression, file, line, xfs_etest_fsname[i]);
|
||||
return 1;
|
||||
|
@ -95,14 +95,14 @@ xfs_errortag_add(int error_tag, xfs_mount_t *mp)
|
|||
|
||||
for (i = 0; i < XFS_NUM_INJECT_ERROR; i++) {
|
||||
if (xfs_etest_fsid[i] == fsid && xfs_etest[i] == error_tag) {
|
||||
cmn_err(CE_WARN, "XFS error tag #%d on", error_tag);
|
||||
xfs_warn(mp, "error tag #%d on", error_tag);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < XFS_NUM_INJECT_ERROR; i++) {
|
||||
if (xfs_etest[i] == 0) {
|
||||
cmn_err(CE_WARN, "Turned on XFS error tag #%d",
|
||||
xfs_warn(mp, "Turned on XFS error tag #%d",
|
||||
error_tag);
|
||||
xfs_etest[i] = error_tag;
|
||||
xfs_etest_fsid[i] = fsid;
|
||||
|
@ -114,7 +114,7 @@ xfs_errortag_add(int error_tag, xfs_mount_t *mp)
|
|||
}
|
||||
}
|
||||
|
||||
cmn_err(CE_WARN, "error tag overflow, too many turned on");
|
||||
xfs_warn(mp, "error tag overflow, too many turned on");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -133,7 +133,7 @@ xfs_errortag_clearall(xfs_mount_t *mp, int loud)
|
|||
if ((fsid == 0LL || xfs_etest_fsid[i] == fsid) &&
|
||||
xfs_etest[i] != 0) {
|
||||
cleared = 1;
|
||||
cmn_err(CE_WARN, "Clearing XFS error tag #%d",
|
||||
xfs_warn(mp, "Clearing XFS error tag #%d",
|
||||
xfs_etest[i]);
|
||||
xfs_etest[i] = 0;
|
||||
xfs_etest_fsid[i] = 0LL;
|
||||
|
@ -144,9 +144,7 @@ xfs_errortag_clearall(xfs_mount_t *mp, int loud)
|
|||
}
|
||||
|
||||
if (loud || cleared)
|
||||
cmn_err(CE_WARN,
|
||||
"Cleared all XFS error tags for filesystem \"%s\"",
|
||||
mp->m_fsname);
|
||||
xfs_warn(mp, "Cleared all XFS error tags for filesystem");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -162,9 +160,8 @@ xfs_error_report(
|
|||
inst_t *ra)
|
||||
{
|
||||
if (level <= xfs_error_level) {
|
||||
xfs_cmn_err(XFS_PTAG_ERROR_REPORT,
|
||||
CE_ALERT, mp,
|
||||
"XFS internal error %s at line %d of file %s. Caller 0x%p\n",
|
||||
xfs_alert_tag(mp, XFS_PTAG_ERROR_REPORT,
|
||||
"Internal error %s at line %d of file %s. Caller 0x%p\n",
|
||||
tag, linenum, filename, ra);
|
||||
|
||||
xfs_stack_trace();
|
||||
|
@ -184,4 +181,5 @@ xfs_corruption_error(
|
|||
if (level <= xfs_error_level)
|
||||
xfs_hex_dump(p, 16);
|
||||
xfs_error_report(tag, level, mp, filename, linenum, ra);
|
||||
xfs_alert(mp, "Corruption detected. Unmount and run xfs_repair");
|
||||
}
|
||||
|
|
|
@ -145,10 +145,8 @@ extern int xfs_errortag_clearall(struct xfs_mount *mp, int loud);
|
|||
#endif /* DEBUG */
|
||||
|
||||
/*
|
||||
* XFS panic tags -- allow a call to xfs_cmn_err() be turned into
|
||||
* a panic by setting xfs_panic_mask in a
|
||||
* sysctl. update xfs_max[XFS_PARAM] if
|
||||
* more are added.
|
||||
* XFS panic tags -- allow a call to xfs_alert_tag() be turned into
|
||||
* a panic by setting xfs_panic_mask in a sysctl.
|
||||
*/
|
||||
#define XFS_NO_PTAG 0
|
||||
#define XFS_PTAG_IFLUSH 0x00000001
|
||||
|
@ -160,17 +158,4 @@ extern int xfs_errortag_clearall(struct xfs_mount *mp, int loud);
|
|||
#define XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040
|
||||
#define XFS_PTAG_FSBLOCK_ZERO 0x00000080
|
||||
|
||||
struct xfs_mount;
|
||||
|
||||
extern void xfs_hex_dump(void *p, int length);
|
||||
|
||||
#define xfs_fs_repair_cmn_err(level, mp, fmt, args...) \
|
||||
xfs_fs_cmn_err(level, mp, fmt " Unmount and run xfs_repair.", ## args)
|
||||
|
||||
#define xfs_fs_mount_cmn_err(f, fmt, args...) \
|
||||
do { \
|
||||
if (!(f & XFS_MFSI_QUIET)) \
|
||||
cmn_err(CE_WARN, "XFS: " fmt, ## args); \
|
||||
} while (0)
|
||||
|
||||
#endif /* __XFS_ERROR_H__ */
|
||||
|
|
|
@ -385,8 +385,8 @@ xfs_growfs_data_private(
|
|||
XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
|
||||
XFS_FSS_TO_BB(mp, 1), 0, &bp);
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"error %d reading secondary superblock for ag %d",
|
||||
xfs_warn(mp,
|
||||
"error %d reading secondary superblock for ag %d",
|
||||
error, agno);
|
||||
break;
|
||||
}
|
||||
|
@ -399,7 +399,7 @@ xfs_growfs_data_private(
|
|||
if (!(error = xfs_bwrite(mp, bp))) {
|
||||
continue;
|
||||
} else {
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
xfs_warn(mp,
|
||||
"write error %d updating secondary superblock for ag %d",
|
||||
error, agno);
|
||||
break; /* no point in continuing */
|
||||
|
|
|
@ -1055,28 +1055,23 @@ xfs_difree(
|
|||
*/
|
||||
agno = XFS_INO_TO_AGNO(mp, inode);
|
||||
if (agno >= mp->m_sb.sb_agcount) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_difree: agno >= mp->m_sb.sb_agcount (%d >= %d) on %s. Returning EINVAL.",
|
||||
agno, mp->m_sb.sb_agcount, mp->m_fsname);
|
||||
xfs_warn(mp, "%s: agno >= mp->m_sb.sb_agcount (%d >= %d).",
|
||||
__func__, agno, mp->m_sb.sb_agcount);
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
agino = XFS_INO_TO_AGINO(mp, inode);
|
||||
if (inode != XFS_AGINO_TO_INO(mp, agno, agino)) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_difree: inode != XFS_AGINO_TO_INO() "
|
||||
"(%llu != %llu) on %s. Returning EINVAL.",
|
||||
(unsigned long long)inode,
|
||||
(unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino),
|
||||
mp->m_fsname);
|
||||
xfs_warn(mp, "%s: inode != XFS_AGINO_TO_INO() (%llu != %llu).",
|
||||
__func__, (unsigned long long)inode,
|
||||
(unsigned long long)XFS_AGINO_TO_INO(mp, agno, agino));
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
agbno = XFS_AGINO_TO_AGBNO(mp, agino);
|
||||
if (agbno >= mp->m_sb.sb_agblocks) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_difree: agbno >= mp->m_sb.sb_agblocks (%d >= %d) on %s. Returning EINVAL.",
|
||||
agbno, mp->m_sb.sb_agblocks, mp->m_fsname);
|
||||
xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).",
|
||||
__func__, agbno, mp->m_sb.sb_agblocks);
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
@ -1085,9 +1080,8 @@ xfs_difree(
|
|||
*/
|
||||
error = xfs_ialloc_read_agi(mp, tp, agno, &agbp);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_difree: xfs_ialloc_read_agi() returned an error %d on %s. Returning error.",
|
||||
error, mp->m_fsname);
|
||||
xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.",
|
||||
__func__, error);
|
||||
return error;
|
||||
}
|
||||
agi = XFS_BUF_TO_AGI(agbp);
|
||||
|
@ -1106,17 +1100,15 @@ xfs_difree(
|
|||
* Look for the entry describing this inode.
|
||||
*/
|
||||
if ((error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i))) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_difree: xfs_inobt_lookup returned() an error %d on %s. Returning error.",
|
||||
error, mp->m_fsname);
|
||||
xfs_warn(mp, "%s: xfs_inobt_lookup() returned error %d.",
|
||||
__func__, error);
|
||||
goto error0;
|
||||
}
|
||||
XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
|
||||
error = xfs_inobt_get_rec(cur, &rec, &i);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_difree: xfs_inobt_get_rec() returned an error %d on %s. Returning error.",
|
||||
error, mp->m_fsname);
|
||||
xfs_warn(mp, "%s: xfs_inobt_get_rec() returned error %d.",
|
||||
__func__, error);
|
||||
goto error0;
|
||||
}
|
||||
XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
|
||||
|
@ -1157,8 +1149,8 @@ xfs_difree(
|
|||
xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -(ilen - 1));
|
||||
|
||||
if ((error = xfs_btree_delete(cur, &i))) {
|
||||
cmn_err(CE_WARN, "xfs_difree: xfs_btree_delete returned an error %d on %s.\n",
|
||||
error, mp->m_fsname);
|
||||
xfs_warn(mp, "%s: xfs_btree_delete returned error %d.",
|
||||
__func__, error);
|
||||
goto error0;
|
||||
}
|
||||
|
||||
|
@ -1170,9 +1162,8 @@ xfs_difree(
|
|||
|
||||
error = xfs_inobt_update(cur, &rec);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_difree: xfs_inobt_update returned an error %d on %s.",
|
||||
error, mp->m_fsname);
|
||||
xfs_warn(mp, "%s: xfs_inobt_update returned error %d.",
|
||||
__func__, error);
|
||||
goto error0;
|
||||
}
|
||||
|
||||
|
@ -1218,10 +1209,9 @@ xfs_imap_lookup(
|
|||
|
||||
error = xfs_ialloc_read_agi(mp, tp, agno, &agbp);
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: "
|
||||
"xfs_ialloc_read_agi() returned "
|
||||
"error %d, agno %d",
|
||||
error, agno);
|
||||
xfs_alert(mp,
|
||||
"%s: xfs_ialloc_read_agi() returned error %d, agno %d",
|
||||
__func__, error, agno);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -1299,24 +1289,21 @@ xfs_imap(
|
|||
if (flags & XFS_IGET_UNTRUSTED)
|
||||
return XFS_ERROR(EINVAL);
|
||||
if (agno >= mp->m_sb.sb_agcount) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_imap: agno (%d) >= "
|
||||
"mp->m_sb.sb_agcount (%d)",
|
||||
agno, mp->m_sb.sb_agcount);
|
||||
xfs_alert(mp,
|
||||
"%s: agno (%d) >= mp->m_sb.sb_agcount (%d)",
|
||||
__func__, agno, mp->m_sb.sb_agcount);
|
||||
}
|
||||
if (agbno >= mp->m_sb.sb_agblocks) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_imap: agbno (0x%llx) >= "
|
||||
"mp->m_sb.sb_agblocks (0x%lx)",
|
||||
(unsigned long long) agbno,
|
||||
(unsigned long) mp->m_sb.sb_agblocks);
|
||||
xfs_alert(mp,
|
||||
"%s: agbno (0x%llx) >= mp->m_sb.sb_agblocks (0x%lx)",
|
||||
__func__, (unsigned long long)agbno,
|
||||
(unsigned long)mp->m_sb.sb_agblocks);
|
||||
}
|
||||
if (ino != XFS_AGINO_TO_INO(mp, agno, agino)) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_imap: ino (0x%llx) != "
|
||||
"XFS_AGINO_TO_INO(mp, agno, agino) "
|
||||
"(0x%llx)",
|
||||
ino, XFS_AGINO_TO_INO(mp, agno, agino));
|
||||
xfs_alert(mp,
|
||||
"%s: ino (0x%llx) != XFS_AGINO_TO_INO() (0x%llx)",
|
||||
__func__, ino,
|
||||
XFS_AGINO_TO_INO(mp, agno, agino));
|
||||
}
|
||||
xfs_stack_trace();
|
||||
#endif /* DEBUG */
|
||||
|
@ -1388,10 +1375,9 @@ out_map:
|
|||
*/
|
||||
if ((imap->im_blkno + imap->im_len) >
|
||||
XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: "
|
||||
"(imap->im_blkno (0x%llx) + imap->im_len (0x%llx)) > "
|
||||
" XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) (0x%llx)",
|
||||
(unsigned long long) imap->im_blkno,
|
||||
xfs_alert(mp,
|
||||
"%s: (im_blkno (0x%llx) + im_len (0x%llx)) > sb_dblocks (0x%llx)",
|
||||
__func__, (unsigned long long) imap->im_blkno,
|
||||
(unsigned long long) imap->im_len,
|
||||
XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks));
|
||||
return XFS_ERROR(EINVAL);
|
||||
|
|
|
@ -110,8 +110,8 @@ xfs_inobp_check(
|
|||
dip = (xfs_dinode_t *)xfs_buf_offset(bp,
|
||||
i * mp->m_sb.sb_inodesize);
|
||||
if (!dip->di_next_unlinked) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"Detected a bogus zero next_unlinked field in incore inode buffer 0x%p. About to pop an ASSERT.",
|
||||
xfs_alert(mp,
|
||||
"Detected bogus zero next_unlinked field in incore inode buffer 0x%p.",
|
||||
bp);
|
||||
ASSERT(dip->di_next_unlinked);
|
||||
}
|
||||
|
@ -142,10 +142,9 @@ xfs_imap_to_bp(
|
|||
(int)imap->im_len, buf_flags, &bp);
|
||||
if (error) {
|
||||
if (error != EAGAIN) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_imap_to_bp: xfs_trans_read_buf()returned "
|
||||
"an error %d on %s. Returning error.",
|
||||
error, mp->m_fsname);
|
||||
xfs_warn(mp,
|
||||
"%s: xfs_trans_read_buf() returned error %d.",
|
||||
__func__, error);
|
||||
} else {
|
||||
ASSERT(buf_flags & XBF_TRYLOCK);
|
||||
}
|
||||
|
@ -180,12 +179,11 @@ xfs_imap_to_bp(
|
|||
XFS_CORRUPTION_ERROR("xfs_imap_to_bp",
|
||||
XFS_ERRLEVEL_HIGH, mp, dip);
|
||||
#ifdef DEBUG
|
||||
cmn_err(CE_PANIC,
|
||||
"Device %s - bad inode magic/vsn "
|
||||
"daddr %lld #%d (magic=%x)",
|
||||
XFS_BUFTARG_NAME(mp->m_ddev_targp),
|
||||
xfs_emerg(mp,
|
||||
"bad inode magic/vsn daddr %lld #%d (magic=%x)",
|
||||
(unsigned long long)imap->im_blkno, i,
|
||||
be16_to_cpu(dip->di_magic));
|
||||
ASSERT(0);
|
||||
#endif
|
||||
xfs_trans_brelse(tp, bp);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
|
@ -317,7 +315,7 @@ xfs_iformat(
|
|||
if (unlikely(be32_to_cpu(dip->di_nextents) +
|
||||
be16_to_cpu(dip->di_anextents) >
|
||||
be64_to_cpu(dip->di_nblocks))) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
xfs_warn(ip->i_mount,
|
||||
"corrupt dinode %Lu, extent total = %d, nblocks = %Lu.",
|
||||
(unsigned long long)ip->i_ino,
|
||||
(int)(be32_to_cpu(dip->di_nextents) +
|
||||
|
@ -330,8 +328,7 @@ xfs_iformat(
|
|||
}
|
||||
|
||||
if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
"corrupt dinode %Lu, forkoff = 0x%x.",
|
||||
xfs_warn(ip->i_mount, "corrupt dinode %Lu, forkoff = 0x%x.",
|
||||
(unsigned long long)ip->i_ino,
|
||||
dip->di_forkoff);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW,
|
||||
|
@ -341,7 +338,7 @@ xfs_iformat(
|
|||
|
||||
if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) &&
|
||||
!ip->i_mount->m_rtdev_targp)) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
xfs_warn(ip->i_mount,
|
||||
"corrupt dinode %Lu, has realtime flag set.",
|
||||
ip->i_ino);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat(realtime)",
|
||||
|
@ -373,9 +370,8 @@ xfs_iformat(
|
|||
* no local regular files yet
|
||||
*/
|
||||
if (unlikely((be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFREG)) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
"corrupt inode %Lu "
|
||||
"(local format for regular file).",
|
||||
xfs_warn(ip->i_mount,
|
||||
"corrupt inode %Lu (local format for regular file).",
|
||||
(unsigned long long) ip->i_ino);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat(4)",
|
||||
XFS_ERRLEVEL_LOW,
|
||||
|
@ -385,9 +381,8 @@ xfs_iformat(
|
|||
|
||||
di_size = be64_to_cpu(dip->di_size);
|
||||
if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
"corrupt inode %Lu "
|
||||
"(bad size %Ld for local inode).",
|
||||
xfs_warn(ip->i_mount,
|
||||
"corrupt inode %Lu (bad size %Ld for local inode).",
|
||||
(unsigned long long) ip->i_ino,
|
||||
(long long) di_size);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat(5)",
|
||||
|
@ -431,9 +426,8 @@ xfs_iformat(
|
|||
size = be16_to_cpu(atp->hdr.totsize);
|
||||
|
||||
if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
"corrupt inode %Lu "
|
||||
"(bad attr fork size %Ld).",
|
||||
xfs_warn(ip->i_mount,
|
||||
"corrupt inode %Lu (bad attr fork size %Ld).",
|
||||
(unsigned long long) ip->i_ino,
|
||||
(long long) size);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat(8)",
|
||||
|
@ -488,9 +482,8 @@ xfs_iformat_local(
|
|||
* kmem_alloc() or memcpy() below.
|
||||
*/
|
||||
if (unlikely(size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
"corrupt inode %Lu "
|
||||
"(bad size %d for local fork, size = %d).",
|
||||
xfs_warn(ip->i_mount,
|
||||
"corrupt inode %Lu (bad size %d for local fork, size = %d).",
|
||||
(unsigned long long) ip->i_ino, size,
|
||||
XFS_DFORK_SIZE(dip, ip->i_mount, whichfork));
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat_local", XFS_ERRLEVEL_LOW,
|
||||
|
@ -547,8 +540,7 @@ xfs_iformat_extents(
|
|||
* kmem_alloc() or memcpy() below.
|
||||
*/
|
||||
if (unlikely(size < 0 || size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
"corrupt inode %Lu ((a)extents = %d).",
|
||||
xfs_warn(ip->i_mount, "corrupt inode %Lu ((a)extents = %d).",
|
||||
(unsigned long long) ip->i_ino, nex);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat_extents(1)", XFS_ERRLEVEL_LOW,
|
||||
ip->i_mount, dip);
|
||||
|
@ -623,11 +615,10 @@ xfs_iformat_btree(
|
|||
|| XFS_BMDR_SPACE_CALC(nrecs) >
|
||||
XFS_DFORK_SIZE(dip, ip->i_mount, whichfork)
|
||||
|| XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) {
|
||||
xfs_fs_repair_cmn_err(CE_WARN, ip->i_mount,
|
||||
"corrupt inode %Lu (btree).",
|
||||
xfs_warn(ip->i_mount, "corrupt inode %Lu (btree).",
|
||||
(unsigned long long) ip->i_ino);
|
||||
XFS_ERROR_REPORT("xfs_iformat_btree", XFS_ERRLEVEL_LOW,
|
||||
ip->i_mount);
|
||||
XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW,
|
||||
ip->i_mount, dip);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
|
@ -813,11 +804,9 @@ xfs_iread(
|
|||
*/
|
||||
if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC) {
|
||||
#ifdef DEBUG
|
||||
xfs_fs_cmn_err(CE_ALERT, mp, "xfs_iread: "
|
||||
"dip->di_magic (0x%x) != "
|
||||
"XFS_DINODE_MAGIC (0x%x)",
|
||||
be16_to_cpu(dip->di_magic),
|
||||
XFS_DINODE_MAGIC);
|
||||
xfs_alert(mp,
|
||||
"%s: dip->di_magic (0x%x) != XFS_DINODE_MAGIC (0x%x)",
|
||||
__func__, be16_to_cpu(dip->di_magic), XFS_DINODE_MAGIC);
|
||||
#endif /* DEBUG */
|
||||
error = XFS_ERROR(EINVAL);
|
||||
goto out_brelse;
|
||||
|
@ -835,9 +824,8 @@ xfs_iread(
|
|||
error = xfs_iformat(ip, dip);
|
||||
if (error) {
|
||||
#ifdef DEBUG
|
||||
xfs_fs_cmn_err(CE_ALERT, mp, "xfs_iread: "
|
||||
"xfs_iformat() returned error %d",
|
||||
error);
|
||||
xfs_alert(mp, "%s: xfs_iformat() returned error %d",
|
||||
__func__, error);
|
||||
#endif /* DEBUG */
|
||||
goto out_brelse;
|
||||
}
|
||||
|
@ -1016,8 +1004,8 @@ xfs_ialloc(
|
|||
* This is because we're setting fields here we need
|
||||
* to prevent others from looking at until we're done.
|
||||
*/
|
||||
error = xfs_trans_iget(tp->t_mountp, tp, ino,
|
||||
XFS_IGET_CREATE, XFS_ILOCK_EXCL, &ip);
|
||||
error = xfs_iget(tp->t_mountp, tp, ino, XFS_IGET_CREATE,
|
||||
XFS_ILOCK_EXCL, &ip);
|
||||
if (error)
|
||||
return error;
|
||||
ASSERT(ip != NULL);
|
||||
|
@ -1166,6 +1154,7 @@ xfs_ialloc(
|
|||
/*
|
||||
* Log the new values stuffed into the inode.
|
||||
*/
|
||||
xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_log_inode(tp, ip, flags);
|
||||
|
||||
/* now that we have an i_mode we can setup inode ops and unlock */
|
||||
|
@ -1820,9 +1809,8 @@ xfs_iunlink_remove(
|
|||
*/
|
||||
error = xfs_itobp(mp, tp, ip, &dip, &ibp, XBF_LOCK);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.",
|
||||
error, mp->m_fsname);
|
||||
xfs_warn(mp, "%s: xfs_itobp() returned error %d.",
|
||||
__func__, error);
|
||||
return error;
|
||||
}
|
||||
next_agino = be32_to_cpu(dip->di_next_unlinked);
|
||||
|
@ -1867,9 +1855,9 @@ xfs_iunlink_remove(
|
|||
error = xfs_inotobp(mp, tp, next_ino, &last_dip,
|
||||
&last_ibp, &last_offset, 0);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_iunlink_remove: xfs_inotobp() returned an error %d on %s. Returning error.",
|
||||
error, mp->m_fsname);
|
||||
xfs_warn(mp,
|
||||
"%s: xfs_inotobp() returned error %d.",
|
||||
__func__, error);
|
||||
return error;
|
||||
}
|
||||
next_agino = be32_to_cpu(last_dip->di_next_unlinked);
|
||||
|
@ -1882,9 +1870,8 @@ xfs_iunlink_remove(
|
|||
*/
|
||||
error = xfs_itobp(mp, tp, ip, &dip, &ibp, XBF_LOCK);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN,
|
||||
"xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.",
|
||||
error, mp->m_fsname);
|
||||
xfs_warn(mp, "%s: xfs_itobp(2) returned error %d.",
|
||||
__func__, error);
|
||||
return error;
|
||||
}
|
||||
next_agino = be32_to_cpu(dip->di_next_unlinked);
|
||||
|
@ -2939,16 +2926,16 @@ xfs_iflush_int(
|
|||
|
||||
if (XFS_TEST_ERROR(be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC,
|
||||
mp, XFS_ERRTAG_IFLUSH_1, XFS_RANDOM_IFLUSH_1)) {
|
||||
xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
|
||||
"xfs_iflush: Bad inode %Lu magic number 0x%x, ptr 0x%p",
|
||||
ip->i_ino, be16_to_cpu(dip->di_magic), dip);
|
||||
xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
|
||||
"%s: Bad inode %Lu magic number 0x%x, ptr 0x%p",
|
||||
__func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip);
|
||||
goto corrupt_out;
|
||||
}
|
||||
if (XFS_TEST_ERROR(ip->i_d.di_magic != XFS_DINODE_MAGIC,
|
||||
mp, XFS_ERRTAG_IFLUSH_2, XFS_RANDOM_IFLUSH_2)) {
|
||||
xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
|
||||
"xfs_iflush: Bad inode %Lu, ptr 0x%p, magic number 0x%x",
|
||||
ip->i_ino, ip, ip->i_d.di_magic);
|
||||
xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
|
||||
"%s: Bad inode %Lu, ptr 0x%p, magic number 0x%x",
|
||||
__func__, ip->i_ino, ip, ip->i_d.di_magic);
|
||||
goto corrupt_out;
|
||||
}
|
||||
if ((ip->i_d.di_mode & S_IFMT) == S_IFREG) {
|
||||
|
@ -2956,9 +2943,9 @@ xfs_iflush_int(
|
|||
(ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) &&
|
||||
(ip->i_d.di_format != XFS_DINODE_FMT_BTREE),
|
||||
mp, XFS_ERRTAG_IFLUSH_3, XFS_RANDOM_IFLUSH_3)) {
|
||||
xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
|
||||
"xfs_iflush: Bad regular inode %Lu, ptr 0x%p",
|
||||
ip->i_ino, ip);
|
||||
xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
|
||||
"%s: Bad regular inode %Lu, ptr 0x%p",
|
||||
__func__, ip->i_ino, ip);
|
||||
goto corrupt_out;
|
||||
}
|
||||
} else if ((ip->i_d.di_mode & S_IFMT) == S_IFDIR) {
|
||||
|
@ -2967,28 +2954,28 @@ xfs_iflush_int(
|
|||
(ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
|
||||
(ip->i_d.di_format != XFS_DINODE_FMT_LOCAL),
|
||||
mp, XFS_ERRTAG_IFLUSH_4, XFS_RANDOM_IFLUSH_4)) {
|
||||
xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
|
||||
"xfs_iflush: Bad directory inode %Lu, ptr 0x%p",
|
||||
ip->i_ino, ip);
|
||||
xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
|
||||
"%s: Bad directory inode %Lu, ptr 0x%p",
|
||||
__func__, ip->i_ino, ip);
|
||||
goto corrupt_out;
|
||||
}
|
||||
}
|
||||
if (XFS_TEST_ERROR(ip->i_d.di_nextents + ip->i_d.di_anextents >
|
||||
ip->i_d.di_nblocks, mp, XFS_ERRTAG_IFLUSH_5,
|
||||
XFS_RANDOM_IFLUSH_5)) {
|
||||
xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
|
||||
"xfs_iflush: detected corrupt incore inode %Lu, total extents = %d, nblocks = %Ld, ptr 0x%p",
|
||||
ip->i_ino,
|
||||
xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
|
||||
"%s: detected corrupt incore inode %Lu, "
|
||||
"total extents = %d, nblocks = %Ld, ptr 0x%p",
|
||||
__func__, ip->i_ino,
|
||||
ip->i_d.di_nextents + ip->i_d.di_anextents,
|
||||
ip->i_d.di_nblocks,
|
||||
ip);
|
||||
ip->i_d.di_nblocks, ip);
|
||||
goto corrupt_out;
|
||||
}
|
||||
if (XFS_TEST_ERROR(ip->i_d.di_forkoff > mp->m_sb.sb_inodesize,
|
||||
mp, XFS_ERRTAG_IFLUSH_6, XFS_RANDOM_IFLUSH_6)) {
|
||||
xfs_cmn_err(XFS_PTAG_IFLUSH, CE_ALERT, mp,
|
||||
"xfs_iflush: bad inode %Lu, forkoff 0x%x, ptr 0x%p",
|
||||
ip->i_ino, ip->i_d.di_forkoff, ip);
|
||||
xfs_alert_tag(mp, XFS_PTAG_IFLUSH,
|
||||
"%s: bad inode %Lu, forkoff 0x%x, ptr 0x%p",
|
||||
__func__, ip->i_ino, ip->i_d.di_forkoff, ip);
|
||||
goto corrupt_out;
|
||||
}
|
||||
/*
|
||||
|
|
|
@ -409,28 +409,35 @@ static inline void xfs_ifunlock(xfs_inode_t *ip)
|
|||
/*
|
||||
* Flags for lockdep annotations.
|
||||
*
|
||||
* XFS_I[O]LOCK_PARENT - for operations that require locking two inodes
|
||||
* (ie directory operations that require locking a directory inode and
|
||||
* an entry inode). The first inode gets locked with this flag so it
|
||||
* gets a lockdep subclass of 1 and the second lock will have a lockdep
|
||||
* subclass of 0.
|
||||
* XFS_LOCK_PARENT - for directory operations that require locking a
|
||||
* parent directory inode and a child entry inode. The parent gets locked
|
||||
* with this flag so it gets a lockdep subclass of 1 and the child entry
|
||||
* lock will have a lockdep subclass of 0.
|
||||
*
|
||||
* XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary
|
||||
* inodes do not participate in the normal lock order, and thus have their
|
||||
* own subclasses.
|
||||
*
|
||||
* XFS_LOCK_INUMORDER - for locking several inodes at the some time
|
||||
* with xfs_lock_inodes(). This flag is used as the starting subclass
|
||||
* and each subsequent lock acquired will increment the subclass by one.
|
||||
* So the first lock acquired will have a lockdep subclass of 2, the
|
||||
* second lock will have a lockdep subclass of 3, and so on. It is
|
||||
* So the first lock acquired will have a lockdep subclass of 4, the
|
||||
* second lock will have a lockdep subclass of 5, and so on. It is
|
||||
* the responsibility of the class builder to shift this to the correct
|
||||
* portion of the lock_mode lockdep mask.
|
||||
*/
|
||||
#define XFS_LOCK_PARENT 1
|
||||
#define XFS_LOCK_INUMORDER 2
|
||||
#define XFS_LOCK_RTBITMAP 2
|
||||
#define XFS_LOCK_RTSUM 3
|
||||
#define XFS_LOCK_INUMORDER 4
|
||||
|
||||
#define XFS_IOLOCK_SHIFT 16
|
||||
#define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT)
|
||||
|
||||
#define XFS_ILOCK_SHIFT 24
|
||||
#define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT)
|
||||
#define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT)
|
||||
#define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT)
|
||||
|
||||
#define XFS_IOLOCK_DEP_MASK 0x00ff0000
|
||||
#define XFS_ILOCK_DEP_MASK 0xff000000
|
||||
|
|
|
@ -101,11 +101,11 @@ xfs_iomap_eof_align_last_fsb(
|
|||
}
|
||||
|
||||
STATIC int
|
||||
xfs_cmn_err_fsblock_zero(
|
||||
xfs_alert_fsblock_zero(
|
||||
xfs_inode_t *ip,
|
||||
xfs_bmbt_irec_t *imap)
|
||||
{
|
||||
xfs_cmn_err(XFS_PTAG_FSBLOCK_ZERO, CE_ALERT, ip->i_mount,
|
||||
xfs_alert_tag(ip->i_mount, XFS_PTAG_FSBLOCK_ZERO,
|
||||
"Access to block zero in inode %llu "
|
||||
"start_block: %llx start_off: %llx "
|
||||
"blkcnt: %llx extent-state: %x\n",
|
||||
|
@ -246,7 +246,7 @@ xfs_iomap_write_direct(
|
|||
}
|
||||
|
||||
if (!(imap->br_startblock || XFS_IS_REALTIME_INODE(ip))) {
|
||||
error = xfs_cmn_err_fsblock_zero(ip, imap);
|
||||
error = xfs_alert_fsblock_zero(ip, imap);
|
||||
goto error_out;
|
||||
}
|
||||
|
||||
|
@ -464,7 +464,7 @@ retry:
|
|||
}
|
||||
|
||||
if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip)))
|
||||
return xfs_cmn_err_fsblock_zero(ip, &imap[0]);
|
||||
return xfs_alert_fsblock_zero(ip, &imap[0]);
|
||||
|
||||
*ret_imap = imap[0];
|
||||
return 0;
|
||||
|
@ -614,7 +614,7 @@ xfs_iomap_write_allocate(
|
|||
* covers at least part of the callers request
|
||||
*/
|
||||
if (!(imap->br_startblock || XFS_IS_REALTIME_INODE(ip)))
|
||||
return xfs_cmn_err_fsblock_zero(ip, imap);
|
||||
return xfs_alert_fsblock_zero(ip, imap);
|
||||
|
||||
if ((offset_fsb >= imap->br_startoff) &&
|
||||
(offset_fsb < (imap->br_startoff +
|
||||
|
@ -724,7 +724,7 @@ xfs_iomap_write_unwritten(
|
|||
return XFS_ERROR(error);
|
||||
|
||||
if (!(imap.br_startblock || XFS_IS_REALTIME_INODE(ip)))
|
||||
return xfs_cmn_err_fsblock_zero(ip, &imap);
|
||||
return xfs_alert_fsblock_zero(ip, &imap);
|
||||
|
||||
if ((numblks_fsb = imap.br_blockcount) == 0) {
|
||||
/*
|
||||
|
|
124
fs/xfs/xfs_log.c
124
fs/xfs/xfs_log.c
|
@ -374,11 +374,10 @@ xfs_log_mount(
|
|||
int error;
|
||||
|
||||
if (!(mp->m_flags & XFS_MOUNT_NORECOVERY))
|
||||
cmn_err(CE_NOTE, "XFS mounting filesystem %s", mp->m_fsname);
|
||||
xfs_notice(mp, "Mounting Filesystem");
|
||||
else {
|
||||
cmn_err(CE_NOTE,
|
||||
"Mounting filesystem \"%s\" in no-recovery mode. Filesystem will be inconsistent.",
|
||||
mp->m_fsname);
|
||||
xfs_notice(mp,
|
||||
"Mounting filesystem in no-recovery mode. Filesystem will be inconsistent.");
|
||||
ASSERT(mp->m_flags & XFS_MOUNT_RDONLY);
|
||||
}
|
||||
|
||||
|
@ -393,7 +392,7 @@ xfs_log_mount(
|
|||
*/
|
||||
error = xfs_trans_ail_init(mp);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS: AIL initialisation failed: error %d", error);
|
||||
xfs_warn(mp, "AIL initialisation failed: error %d", error);
|
||||
goto out_free_log;
|
||||
}
|
||||
mp->m_log->l_ailp = mp->m_ail;
|
||||
|
@ -413,7 +412,8 @@ xfs_log_mount(
|
|||
if (readonly)
|
||||
mp->m_flags |= XFS_MOUNT_RDONLY;
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS: log mount/recovery failed: error %d", error);
|
||||
xfs_warn(mp, "log mount/recovery failed: error %d",
|
||||
error);
|
||||
goto out_destroy_ail;
|
||||
}
|
||||
}
|
||||
|
@ -542,10 +542,8 @@ xfs_log_unmount_write(xfs_mount_t *mp)
|
|||
*/
|
||||
}
|
||||
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_log_unmount: unmount record failed");
|
||||
}
|
||||
if (error)
|
||||
xfs_alert(mp, "%s: unmount record failed", __func__);
|
||||
|
||||
|
||||
spin_lock(&log->l_icloglock);
|
||||
|
@ -852,7 +850,7 @@ xlog_space_left(
|
|||
* In this case we just want to return the size of the
|
||||
* log as the amount of space left.
|
||||
*/
|
||||
xfs_fs_cmn_err(CE_ALERT, log->l_mp,
|
||||
xfs_alert(log->l_mp,
|
||||
"xlog_space_left: head behind tail\n"
|
||||
" tail_cycle = %d, tail_bytes = %d\n"
|
||||
" GH cycle = %d, GH bytes = %d",
|
||||
|
@ -1001,7 +999,7 @@ xlog_alloc_log(xfs_mount_t *mp,
|
|||
|
||||
log = kmem_zalloc(sizeof(xlog_t), KM_MAYFAIL);
|
||||
if (!log) {
|
||||
xlog_warn("XFS: Log allocation failed: No memory!");
|
||||
xfs_warn(mp, "Log allocation failed: No memory!");
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -1029,24 +1027,24 @@ xlog_alloc_log(xfs_mount_t *mp,
|
|||
if (xfs_sb_version_hassector(&mp->m_sb)) {
|
||||
log2_size = mp->m_sb.sb_logsectlog;
|
||||
if (log2_size < BBSHIFT) {
|
||||
xlog_warn("XFS: Log sector size too small "
|
||||
"(0x%x < 0x%x)", log2_size, BBSHIFT);
|
||||
xfs_warn(mp, "Log sector size too small (0x%x < 0x%x)",
|
||||
log2_size, BBSHIFT);
|
||||
goto out_free_log;
|
||||
}
|
||||
|
||||
log2_size -= BBSHIFT;
|
||||
if (log2_size > mp->m_sectbb_log) {
|
||||
xlog_warn("XFS: Log sector size too large "
|
||||
"(0x%x > 0x%x)", log2_size, mp->m_sectbb_log);
|
||||
xfs_warn(mp, "Log sector size too large (0x%x > 0x%x)",
|
||||
log2_size, mp->m_sectbb_log);
|
||||
goto out_free_log;
|
||||
}
|
||||
|
||||
/* for larger sector sizes, must have v2 or external log */
|
||||
if (log2_size && log->l_logBBstart > 0 &&
|
||||
!xfs_sb_version_haslogv2(&mp->m_sb)) {
|
||||
|
||||
xlog_warn("XFS: log sector size (0x%x) invalid "
|
||||
"for configuration.", log2_size);
|
||||
xfs_warn(mp,
|
||||
"log sector size (0x%x) invalid for configuration.",
|
||||
log2_size);
|
||||
goto out_free_log;
|
||||
}
|
||||
}
|
||||
|
@ -1563,38 +1561,36 @@ xlog_print_tic_res(
|
|||
"SWAPEXT"
|
||||
};
|
||||
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"xfs_log_write: reservation summary:\n"
|
||||
" trans type = %s (%u)\n"
|
||||
" unit res = %d bytes\n"
|
||||
" current res = %d bytes\n"
|
||||
" total reg = %u bytes (o/flow = %u bytes)\n"
|
||||
" ophdrs = %u (ophdr space = %u bytes)\n"
|
||||
" ophdr + reg = %u bytes\n"
|
||||
" num regions = %u\n",
|
||||
((ticket->t_trans_type <= 0 ||
|
||||
ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ?
|
||||
"bad-trans-type" : trans_type_str[ticket->t_trans_type-1]),
|
||||
ticket->t_trans_type,
|
||||
ticket->t_unit_res,
|
||||
ticket->t_curr_res,
|
||||
ticket->t_res_arr_sum, ticket->t_res_o_flow,
|
||||
ticket->t_res_num_ophdrs, ophdr_spc,
|
||||
ticket->t_res_arr_sum +
|
||||
ticket->t_res_o_flow + ophdr_spc,
|
||||
ticket->t_res_num);
|
||||
xfs_warn(mp,
|
||||
"xfs_log_write: reservation summary:\n"
|
||||
" trans type = %s (%u)\n"
|
||||
" unit res = %d bytes\n"
|
||||
" current res = %d bytes\n"
|
||||
" total reg = %u bytes (o/flow = %u bytes)\n"
|
||||
" ophdrs = %u (ophdr space = %u bytes)\n"
|
||||
" ophdr + reg = %u bytes\n"
|
||||
" num regions = %u\n",
|
||||
((ticket->t_trans_type <= 0 ||
|
||||
ticket->t_trans_type > XFS_TRANS_TYPE_MAX) ?
|
||||
"bad-trans-type" : trans_type_str[ticket->t_trans_type-1]),
|
||||
ticket->t_trans_type,
|
||||
ticket->t_unit_res,
|
||||
ticket->t_curr_res,
|
||||
ticket->t_res_arr_sum, ticket->t_res_o_flow,
|
||||
ticket->t_res_num_ophdrs, ophdr_spc,
|
||||
ticket->t_res_arr_sum +
|
||||
ticket->t_res_o_flow + ophdr_spc,
|
||||
ticket->t_res_num);
|
||||
|
||||
for (i = 0; i < ticket->t_res_num; i++) {
|
||||
uint r_type = ticket->t_res_arr[i].r_type;
|
||||
cmn_err(CE_WARN,
|
||||
"region[%u]: %s - %u bytes\n",
|
||||
i,
|
||||
uint r_type = ticket->t_res_arr[i].r_type;
|
||||
xfs_warn(mp, "region[%u]: %s - %u bytes\n", i,
|
||||
((r_type <= 0 || r_type > XLOG_REG_TYPE_MAX) ?
|
||||
"bad-rtype" : res_type_str[r_type-1]),
|
||||
ticket->t_res_arr[i].r_len);
|
||||
}
|
||||
|
||||
xfs_cmn_err(XFS_PTAG_LOGRES, CE_ALERT, mp,
|
||||
xfs_alert_tag(mp, XFS_PTAG_LOGRES,
|
||||
"xfs_log_write: reservation ran out. Need to up reservation");
|
||||
xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
|
||||
}
|
||||
|
@ -1682,7 +1678,7 @@ xlog_write_setup_ophdr(
|
|||
case XFS_LOG:
|
||||
break;
|
||||
default:
|
||||
xfs_fs_cmn_err(CE_WARN, log->l_mp,
|
||||
xfs_warn(log->l_mp,
|
||||
"Bad XFS transaction clientid 0x%x in ticket 0x%p",
|
||||
ophdr->oh_clientid, ticket);
|
||||
return NULL;
|
||||
|
@ -2264,7 +2260,7 @@ xlog_state_do_callback(
|
|||
if (repeats > 5000) {
|
||||
flushcnt += repeats;
|
||||
repeats = 0;
|
||||
xfs_fs_cmn_err(CE_WARN, log->l_mp,
|
||||
xfs_warn(log->l_mp,
|
||||
"%s: possible infinite loop (%d iterations)",
|
||||
__func__, flushcnt);
|
||||
}
|
||||
|
@ -3052,10 +3048,8 @@ xfs_log_force(
|
|||
int error;
|
||||
|
||||
error = _xfs_log_force(mp, flags, NULL);
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_WARN, mp, "xfs_log_force: "
|
||||
"error %d returned.", error);
|
||||
}
|
||||
if (error)
|
||||
xfs_warn(mp, "%s: error %d returned.", __func__, error);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3204,10 +3198,8 @@ xfs_log_force_lsn(
|
|||
int error;
|
||||
|
||||
error = _xfs_log_force_lsn(mp, lsn, flags, NULL);
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_WARN, mp, "xfs_log_force: "
|
||||
"error %d returned.", error);
|
||||
}
|
||||
if (error)
|
||||
xfs_warn(mp, "%s: error %d returned.", __func__, error);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3412,7 +3404,7 @@ xlog_verify_dest_ptr(
|
|||
}
|
||||
|
||||
if (!good_ptr)
|
||||
xlog_panic("xlog_verify_dest_ptr: invalid ptr");
|
||||
xfs_emerg(log->l_mp, "%s: invalid ptr", __func__);
|
||||
}
|
||||
|
||||
STATIC void
|
||||
|
@ -3448,16 +3440,16 @@ xlog_verify_tail_lsn(xlog_t *log,
|
|||
blocks =
|
||||
log->l_logBBsize - (log->l_prev_block - BLOCK_LSN(tail_lsn));
|
||||
if (blocks < BTOBB(iclog->ic_offset)+BTOBB(log->l_iclog_hsize))
|
||||
xlog_panic("xlog_verify_tail_lsn: ran out of log space");
|
||||
xfs_emerg(log->l_mp, "%s: ran out of log space", __func__);
|
||||
} else {
|
||||
ASSERT(CYCLE_LSN(tail_lsn)+1 == log->l_prev_cycle);
|
||||
|
||||
if (BLOCK_LSN(tail_lsn) == log->l_prev_block)
|
||||
xlog_panic("xlog_verify_tail_lsn: tail wrapped");
|
||||
xfs_emerg(log->l_mp, "%s: tail wrapped", __func__);
|
||||
|
||||
blocks = BLOCK_LSN(tail_lsn) - log->l_prev_block;
|
||||
if (blocks < BTOBB(iclog->ic_offset) + 1)
|
||||
xlog_panic("xlog_verify_tail_lsn: ran out of log space");
|
||||
xfs_emerg(log->l_mp, "%s: ran out of log space", __func__);
|
||||
}
|
||||
} /* xlog_verify_tail_lsn */
|
||||
|
||||
|
@ -3497,22 +3489,23 @@ xlog_verify_iclog(xlog_t *log,
|
|||
icptr = log->l_iclog;
|
||||
for (i=0; i < log->l_iclog_bufs; i++) {
|
||||
if (icptr == NULL)
|
||||
xlog_panic("xlog_verify_iclog: invalid ptr");
|
||||
xfs_emerg(log->l_mp, "%s: invalid ptr", __func__);
|
||||
icptr = icptr->ic_next;
|
||||
}
|
||||
if (icptr != log->l_iclog)
|
||||
xlog_panic("xlog_verify_iclog: corrupt iclog ring");
|
||||
xfs_emerg(log->l_mp, "%s: corrupt iclog ring", __func__);
|
||||
spin_unlock(&log->l_icloglock);
|
||||
|
||||
/* check log magic numbers */
|
||||
if (be32_to_cpu(iclog->ic_header.h_magicno) != XLOG_HEADER_MAGIC_NUM)
|
||||
xlog_panic("xlog_verify_iclog: invalid magic num");
|
||||
xfs_emerg(log->l_mp, "%s: invalid magic num", __func__);
|
||||
|
||||
ptr = (xfs_caddr_t) &iclog->ic_header;
|
||||
for (ptr += BBSIZE; ptr < ((xfs_caddr_t)&iclog->ic_header) + count;
|
||||
ptr += BBSIZE) {
|
||||
if (be32_to_cpu(*(__be32 *)ptr) == XLOG_HEADER_MAGIC_NUM)
|
||||
xlog_panic("xlog_verify_iclog: unexpected magic num");
|
||||
xfs_emerg(log->l_mp, "%s: unexpected magic num",
|
||||
__func__);
|
||||
}
|
||||
|
||||
/* check fields */
|
||||
|
@ -3542,9 +3535,10 @@ xlog_verify_iclog(xlog_t *log,
|
|||
}
|
||||
}
|
||||
if (clientid != XFS_TRANSACTION && clientid != XFS_LOG)
|
||||
cmn_err(CE_WARN, "xlog_verify_iclog: "
|
||||
"invalid clientid %d op 0x%p offset 0x%lx",
|
||||
clientid, ophead, (unsigned long)field_offset);
|
||||
xfs_warn(log->l_mp,
|
||||
"%s: invalid clientid %d op 0x%p offset 0x%lx",
|
||||
__func__, clientid, ophead,
|
||||
(unsigned long)field_offset);
|
||||
|
||||
/* check length */
|
||||
field_offset = (__psint_t)
|
||||
|
|
|
@ -87,10 +87,6 @@ static inline uint xlog_get_client_id(__be32 i)
|
|||
return be32_to_cpu(i) >> 24;
|
||||
}
|
||||
|
||||
#define xlog_panic(args...) cmn_err(CE_PANIC, ## args)
|
||||
#define xlog_exit(args...) cmn_err(CE_PANIC, ## args)
|
||||
#define xlog_warn(args...) cmn_err(CE_WARN, ## args)
|
||||
|
||||
/*
|
||||
* In core log state
|
||||
*/
|
||||
|
|
|
@ -92,7 +92,7 @@ xlog_get_bp(
|
|||
int nbblks)
|
||||
{
|
||||
if (!xlog_buf_bbcount_valid(log, nbblks)) {
|
||||
xlog_warn("XFS: Invalid block length (0x%x) given for buffer",
|
||||
xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer",
|
||||
nbblks);
|
||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp);
|
||||
return NULL;
|
||||
|
@ -160,7 +160,7 @@ xlog_bread_noalign(
|
|||
int error;
|
||||
|
||||
if (!xlog_buf_bbcount_valid(log, nbblks)) {
|
||||
xlog_warn("XFS: Invalid block length (0x%x) given for buffer",
|
||||
xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer",
|
||||
nbblks);
|
||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp);
|
||||
return EFSCORRUPTED;
|
||||
|
@ -219,7 +219,7 @@ xlog_bwrite(
|
|||
int error;
|
||||
|
||||
if (!xlog_buf_bbcount_valid(log, nbblks)) {
|
||||
xlog_warn("XFS: Invalid block length (0x%x) given for buffer",
|
||||
xfs_warn(log->l_mp, "Invalid block length (0x%x) for buffer",
|
||||
nbblks);
|
||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_HIGH, log->l_mp);
|
||||
return EFSCORRUPTED;
|
||||
|
@ -254,9 +254,9 @@ xlog_header_check_dump(
|
|||
xfs_mount_t *mp,
|
||||
xlog_rec_header_t *head)
|
||||
{
|
||||
cmn_err(CE_DEBUG, "%s: SB : uuid = %pU, fmt = %d\n",
|
||||
xfs_debug(mp, "%s: SB : uuid = %pU, fmt = %d\n",
|
||||
__func__, &mp->m_sb.sb_uuid, XLOG_FMT);
|
||||
cmn_err(CE_DEBUG, " log : uuid = %pU, fmt = %d\n",
|
||||
xfs_debug(mp, " log : uuid = %pU, fmt = %d\n",
|
||||
&head->h_fs_uuid, be32_to_cpu(head->h_fmt));
|
||||
}
|
||||
#else
|
||||
|
@ -279,15 +279,15 @@ xlog_header_check_recover(
|
|||
* a dirty log created in IRIX.
|
||||
*/
|
||||
if (unlikely(be32_to_cpu(head->h_fmt) != XLOG_FMT)) {
|
||||
xlog_warn(
|
||||
"XFS: dirty log written in incompatible format - can't recover");
|
||||
xfs_warn(mp,
|
||||
"dirty log written in incompatible format - can't recover");
|
||||
xlog_header_check_dump(mp, head);
|
||||
XFS_ERROR_REPORT("xlog_header_check_recover(1)",
|
||||
XFS_ERRLEVEL_HIGH, mp);
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
} else if (unlikely(!uuid_equal(&mp->m_sb.sb_uuid, &head->h_fs_uuid))) {
|
||||
xlog_warn(
|
||||
"XFS: dirty log entry has mismatched uuid - can't recover");
|
||||
xfs_warn(mp,
|
||||
"dirty log entry has mismatched uuid - can't recover");
|
||||
xlog_header_check_dump(mp, head);
|
||||
XFS_ERROR_REPORT("xlog_header_check_recover(2)",
|
||||
XFS_ERRLEVEL_HIGH, mp);
|
||||
|
@ -312,9 +312,9 @@ xlog_header_check_mount(
|
|||
* h_fs_uuid is nil, we assume this log was last mounted
|
||||
* by IRIX and continue.
|
||||
*/
|
||||
xlog_warn("XFS: nil uuid in log - IRIX style log");
|
||||
xfs_warn(mp, "nil uuid in log - IRIX style log");
|
||||
} else if (unlikely(!uuid_equal(&mp->m_sb.sb_uuid, &head->h_fs_uuid))) {
|
||||
xlog_warn("XFS: log has mismatched uuid - can't recover");
|
||||
xfs_warn(mp, "log has mismatched uuid - can't recover");
|
||||
xlog_header_check_dump(mp, head);
|
||||
XFS_ERROR_REPORT("xlog_header_check_mount",
|
||||
XFS_ERRLEVEL_HIGH, mp);
|
||||
|
@ -490,8 +490,8 @@ xlog_find_verify_log_record(
|
|||
for (i = (*last_blk) - 1; i >= 0; i--) {
|
||||
if (i < start_blk) {
|
||||
/* valid log record not found */
|
||||
xlog_warn(
|
||||
"XFS: Log inconsistent (didn't find previous header)");
|
||||
xfs_warn(log->l_mp,
|
||||
"Log inconsistent (didn't find previous header)");
|
||||
ASSERT(0);
|
||||
error = XFS_ERROR(EIO);
|
||||
goto out;
|
||||
|
@ -591,12 +591,12 @@ xlog_find_head(
|
|||
* mkfs etc write a dummy unmount record to a fresh
|
||||
* log so we can store the uuid in there
|
||||
*/
|
||||
xlog_warn("XFS: totally zeroed log");
|
||||
xfs_warn(log->l_mp, "totally zeroed log");
|
||||
}
|
||||
|
||||
return 0;
|
||||
} else if (error) {
|
||||
xlog_warn("XFS: empty log check failed");
|
||||
xfs_warn(log->l_mp, "empty log check failed");
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -819,7 +819,7 @@ validate_head:
|
|||
xlog_put_bp(bp);
|
||||
|
||||
if (error)
|
||||
xlog_warn("XFS: failed to find log head");
|
||||
xfs_warn(log->l_mp, "failed to find log head");
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -912,7 +912,7 @@ xlog_find_tail(
|
|||
}
|
||||
}
|
||||
if (!found) {
|
||||
xlog_warn("XFS: xlog_find_tail: couldn't find sync record");
|
||||
xfs_warn(log->l_mp, "%s: couldn't find sync record", __func__);
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
|
@ -1028,7 +1028,7 @@ done:
|
|||
xlog_put_bp(bp);
|
||||
|
||||
if (error)
|
||||
xlog_warn("XFS: failed to locate log tail");
|
||||
xfs_warn(log->l_mp, "failed to locate log tail");
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -1092,7 +1092,8 @@ xlog_find_zeroed(
|
|||
* the first block must be 1. If it's not, maybe we're
|
||||
* not looking at a log... Bail out.
|
||||
*/
|
||||
xlog_warn("XFS: Log inconsistent or not a log (last==0, first!=1)");
|
||||
xfs_warn(log->l_mp,
|
||||
"Log inconsistent or not a log (last==0, first!=1)");
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
|
@ -1506,8 +1507,8 @@ xlog_recover_add_to_trans(
|
|||
if (list_empty(&trans->r_itemq)) {
|
||||
/* we need to catch log corruptions here */
|
||||
if (*(uint *)dp != XFS_TRANS_HEADER_MAGIC) {
|
||||
xlog_warn("XFS: xlog_recover_add_to_trans: "
|
||||
"bad header magic number");
|
||||
xfs_warn(log->l_mp, "%s: bad header magic number",
|
||||
__func__);
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
|
@ -1534,8 +1535,8 @@ xlog_recover_add_to_trans(
|
|||
if (item->ri_total == 0) { /* first region to be added */
|
||||
if (in_f->ilf_size == 0 ||
|
||||
in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) {
|
||||
xlog_warn(
|
||||
"XFS: bad number of regions (%d) in inode log format",
|
||||
xfs_warn(log->l_mp,
|
||||
"bad number of regions (%d) in inode log format",
|
||||
in_f->ilf_size);
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EIO);
|
||||
|
@ -1592,8 +1593,9 @@ xlog_recover_reorder_trans(
|
|||
list_move_tail(&item->ri_list, &trans->r_itemq);
|
||||
break;
|
||||
default:
|
||||
xlog_warn(
|
||||
"XFS: xlog_recover_reorder_trans: unrecognized type of log operation");
|
||||
xfs_warn(log->l_mp,
|
||||
"%s: unrecognized type of log operation",
|
||||
__func__);
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
|
@ -1803,8 +1805,9 @@ xlog_recover_do_inode_buffer(
|
|||
logged_nextp = item->ri_buf[item_index].i_addr +
|
||||
next_unlinked_offset - reg_buf_offset;
|
||||
if (unlikely(*logged_nextp == 0)) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"bad inode buffer log record (ptr = 0x%p, bp = 0x%p). XFS trying to replay bad (0) inode di_next_unlinked field",
|
||||
xfs_alert(mp,
|
||||
"Bad inode buffer log record (ptr = 0x%p, bp = 0x%p). "
|
||||
"Trying to replay bad (0) inode di_next_unlinked field.",
|
||||
item, bp);
|
||||
XFS_ERROR_REPORT("xlog_recover_do_inode_buf",
|
||||
XFS_ERRLEVEL_LOW, mp);
|
||||
|
@ -1863,17 +1866,17 @@ xlog_recover_do_reg_buffer(
|
|||
if (buf_f->blf_flags &
|
||||
(XFS_BLF_UDQUOT_BUF|XFS_BLF_PDQUOT_BUF|XFS_BLF_GDQUOT_BUF)) {
|
||||
if (item->ri_buf[i].i_addr == NULL) {
|
||||
cmn_err(CE_ALERT,
|
||||
xfs_alert(mp,
|
||||
"XFS: NULL dquot in %s.", __func__);
|
||||
goto next;
|
||||
}
|
||||
if (item->ri_buf[i].i_len < sizeof(xfs_disk_dquot_t)) {
|
||||
cmn_err(CE_ALERT,
|
||||
xfs_alert(mp,
|
||||
"XFS: dquot too small (%d) in %s.",
|
||||
item->ri_buf[i].i_len, __func__);
|
||||
goto next;
|
||||
}
|
||||
error = xfs_qm_dqcheck(item->ri_buf[i].i_addr,
|
||||
error = xfs_qm_dqcheck(mp, item->ri_buf[i].i_addr,
|
||||
-1, 0, XFS_QMOPT_DOWARN,
|
||||
"dquot_buf_recover");
|
||||
if (error)
|
||||
|
@ -1898,6 +1901,7 @@ xlog_recover_do_reg_buffer(
|
|||
*/
|
||||
int
|
||||
xfs_qm_dqcheck(
|
||||
struct xfs_mount *mp,
|
||||
xfs_disk_dquot_t *ddq,
|
||||
xfs_dqid_t id,
|
||||
uint type, /* used only when IO_dorepair is true */
|
||||
|
@ -1924,14 +1928,14 @@ xfs_qm_dqcheck(
|
|||
*/
|
||||
if (be16_to_cpu(ddq->d_magic) != XFS_DQUOT_MAGIC) {
|
||||
if (flags & XFS_QMOPT_DOWARN)
|
||||
cmn_err(CE_ALERT,
|
||||
xfs_alert(mp,
|
||||
"%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x",
|
||||
str, id, be16_to_cpu(ddq->d_magic), XFS_DQUOT_MAGIC);
|
||||
errs++;
|
||||
}
|
||||
if (ddq->d_version != XFS_DQUOT_VERSION) {
|
||||
if (flags & XFS_QMOPT_DOWARN)
|
||||
cmn_err(CE_ALERT,
|
||||
xfs_alert(mp,
|
||||
"%s : XFS dquot ID 0x%x, version 0x%x != 0x%x",
|
||||
str, id, ddq->d_version, XFS_DQUOT_VERSION);
|
||||
errs++;
|
||||
|
@ -1941,7 +1945,7 @@ xfs_qm_dqcheck(
|
|||
ddq->d_flags != XFS_DQ_PROJ &&
|
||||
ddq->d_flags != XFS_DQ_GROUP) {
|
||||
if (flags & XFS_QMOPT_DOWARN)
|
||||
cmn_err(CE_ALERT,
|
||||
xfs_alert(mp,
|
||||
"%s : XFS dquot ID 0x%x, unknown flags 0x%x",
|
||||
str, id, ddq->d_flags);
|
||||
errs++;
|
||||
|
@ -1949,7 +1953,7 @@ xfs_qm_dqcheck(
|
|||
|
||||
if (id != -1 && id != be32_to_cpu(ddq->d_id)) {
|
||||
if (flags & XFS_QMOPT_DOWARN)
|
||||
cmn_err(CE_ALERT,
|
||||
xfs_alert(mp,
|
||||
"%s : ondisk-dquot 0x%p, ID mismatch: "
|
||||
"0x%x expected, found id 0x%x",
|
||||
str, ddq, id, be32_to_cpu(ddq->d_id));
|
||||
|
@ -1962,9 +1966,8 @@ xfs_qm_dqcheck(
|
|||
be64_to_cpu(ddq->d_blk_softlimit)) {
|
||||
if (!ddq->d_btimer) {
|
||||
if (flags & XFS_QMOPT_DOWARN)
|
||||
cmn_err(CE_ALERT,
|
||||
"%s : Dquot ID 0x%x (0x%p) "
|
||||
"BLK TIMER NOT STARTED",
|
||||
xfs_alert(mp,
|
||||
"%s : Dquot ID 0x%x (0x%p) BLK TIMER NOT STARTED",
|
||||
str, (int)be32_to_cpu(ddq->d_id), ddq);
|
||||
errs++;
|
||||
}
|
||||
|
@ -1974,9 +1977,8 @@ xfs_qm_dqcheck(
|
|||
be64_to_cpu(ddq->d_ino_softlimit)) {
|
||||
if (!ddq->d_itimer) {
|
||||
if (flags & XFS_QMOPT_DOWARN)
|
||||
cmn_err(CE_ALERT,
|
||||
"%s : Dquot ID 0x%x (0x%p) "
|
||||
"INODE TIMER NOT STARTED",
|
||||
xfs_alert(mp,
|
||||
"%s : Dquot ID 0x%x (0x%p) INODE TIMER NOT STARTED",
|
||||
str, (int)be32_to_cpu(ddq->d_id), ddq);
|
||||
errs++;
|
||||
}
|
||||
|
@ -1986,9 +1988,8 @@ xfs_qm_dqcheck(
|
|||
be64_to_cpu(ddq->d_rtb_softlimit)) {
|
||||
if (!ddq->d_rtbtimer) {
|
||||
if (flags & XFS_QMOPT_DOWARN)
|
||||
cmn_err(CE_ALERT,
|
||||
"%s : Dquot ID 0x%x (0x%p) "
|
||||
"RTBLK TIMER NOT STARTED",
|
||||
xfs_alert(mp,
|
||||
"%s : Dquot ID 0x%x (0x%p) RTBLK TIMER NOT STARTED",
|
||||
str, (int)be32_to_cpu(ddq->d_id), ddq);
|
||||
errs++;
|
||||
}
|
||||
|
@ -1999,7 +2000,7 @@ xfs_qm_dqcheck(
|
|||
return errs;
|
||||
|
||||
if (flags & XFS_QMOPT_DOWARN)
|
||||
cmn_err(CE_NOTE, "Re-initializing dquot ID 0x%x", id);
|
||||
xfs_notice(mp, "Re-initializing dquot ID 0x%x", id);
|
||||
|
||||
/*
|
||||
* Typically, a repair is only requested by quotacheck.
|
||||
|
@ -2218,9 +2219,9 @@ xlog_recover_inode_pass2(
|
|||
*/
|
||||
if (unlikely(be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC)) {
|
||||
xfs_buf_relse(bp);
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_inode_recover: Bad inode magic number, dino ptr = 0x%p, dino bp = 0x%p, ino = %Ld",
|
||||
dip, bp, in_f->ilf_ino);
|
||||
xfs_alert(mp,
|
||||
"%s: Bad inode magic number, dip = 0x%p, dino bp = 0x%p, ino = %Ld",
|
||||
__func__, dip, bp, in_f->ilf_ino);
|
||||
XFS_ERROR_REPORT("xlog_recover_inode_pass2(1)",
|
||||
XFS_ERRLEVEL_LOW, mp);
|
||||
error = EFSCORRUPTED;
|
||||
|
@ -2229,9 +2230,9 @@ xlog_recover_inode_pass2(
|
|||
dicp = item->ri_buf[1].i_addr;
|
||||
if (unlikely(dicp->di_magic != XFS_DINODE_MAGIC)) {
|
||||
xfs_buf_relse(bp);
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_inode_recover: Bad inode log record, rec ptr 0x%p, ino %Ld",
|
||||
item, in_f->ilf_ino);
|
||||
xfs_alert(mp,
|
||||
"%s: Bad inode log record, rec ptr 0x%p, ino %Ld",
|
||||
__func__, item, in_f->ilf_ino);
|
||||
XFS_ERROR_REPORT("xlog_recover_inode_pass2(2)",
|
||||
XFS_ERRLEVEL_LOW, mp);
|
||||
error = EFSCORRUPTED;
|
||||
|
@ -2263,9 +2264,10 @@ xlog_recover_inode_pass2(
|
|||
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)",
|
||||
XFS_ERRLEVEL_LOW, mp, dicp);
|
||||
xfs_buf_relse(bp);
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_inode_recover: Bad regular inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
|
||||
item, dip, bp, in_f->ilf_ino);
|
||||
xfs_alert(mp,
|
||||
"%s: Bad regular inode log record, rec ptr 0x%p, "
|
||||
"ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
|
||||
__func__, item, dip, bp, in_f->ilf_ino);
|
||||
error = EFSCORRUPTED;
|
||||
goto error;
|
||||
}
|
||||
|
@ -2276,9 +2278,10 @@ xlog_recover_inode_pass2(
|
|||
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(4)",
|
||||
XFS_ERRLEVEL_LOW, mp, dicp);
|
||||
xfs_buf_relse(bp);
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_inode_recover: Bad dir inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
|
||||
item, dip, bp, in_f->ilf_ino);
|
||||
xfs_alert(mp,
|
||||
"%s: Bad dir inode log record, rec ptr 0x%p, "
|
||||
"ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
|
||||
__func__, item, dip, bp, in_f->ilf_ino);
|
||||
error = EFSCORRUPTED;
|
||||
goto error;
|
||||
}
|
||||
|
@ -2287,9 +2290,10 @@ xlog_recover_inode_pass2(
|
|||
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(5)",
|
||||
XFS_ERRLEVEL_LOW, mp, dicp);
|
||||
xfs_buf_relse(bp);
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_inode_recover: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, dino bp 0x%p, ino %Ld, total extents = %d, nblocks = %Ld",
|
||||
item, dip, bp, in_f->ilf_ino,
|
||||
xfs_alert(mp,
|
||||
"%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, "
|
||||
"dino bp 0x%p, ino %Ld, total extents = %d, nblocks = %Ld",
|
||||
__func__, item, dip, bp, in_f->ilf_ino,
|
||||
dicp->di_nextents + dicp->di_anextents,
|
||||
dicp->di_nblocks);
|
||||
error = EFSCORRUPTED;
|
||||
|
@ -2299,8 +2303,9 @@ xlog_recover_inode_pass2(
|
|||
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(6)",
|
||||
XFS_ERRLEVEL_LOW, mp, dicp);
|
||||
xfs_buf_relse(bp);
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_inode_recover: Bad inode log rec ptr 0x%p, dino ptr 0x%p, dino bp 0x%p, ino %Ld, forkoff 0x%x",
|
||||
xfs_alert(mp,
|
||||
"%s: Bad inode log record, rec ptr 0x%p, dino ptr 0x%p, "
|
||||
"dino bp 0x%p, ino %Ld, forkoff 0x%x", __func__,
|
||||
item, dip, bp, in_f->ilf_ino, dicp->di_forkoff);
|
||||
error = EFSCORRUPTED;
|
||||
goto error;
|
||||
|
@ -2309,9 +2314,9 @@ xlog_recover_inode_pass2(
|
|||
XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(7)",
|
||||
XFS_ERRLEVEL_LOW, mp, dicp);
|
||||
xfs_buf_relse(bp);
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_inode_recover: Bad inode log record length %d, rec ptr 0x%p",
|
||||
item->ri_buf[1].i_len, item);
|
||||
xfs_alert(mp,
|
||||
"%s: Bad inode log record length %d, rec ptr 0x%p",
|
||||
__func__, item->ri_buf[1].i_len, item);
|
||||
error = EFSCORRUPTED;
|
||||
goto error;
|
||||
}
|
||||
|
@ -2398,7 +2403,7 @@ xlog_recover_inode_pass2(
|
|||
break;
|
||||
|
||||
default:
|
||||
xlog_warn("XFS: xlog_recover_inode_pass2: Invalid flag");
|
||||
xfs_warn(log->l_mp, "%s: Invalid flag", __func__);
|
||||
ASSERT(0);
|
||||
xfs_buf_relse(bp);
|
||||
error = EIO;
|
||||
|
@ -2467,13 +2472,11 @@ xlog_recover_dquot_pass2(
|
|||
|
||||
recddq = item->ri_buf[1].i_addr;
|
||||
if (recddq == NULL) {
|
||||
cmn_err(CE_ALERT,
|
||||
"XFS: NULL dquot in %s.", __func__);
|
||||
xfs_alert(log->l_mp, "NULL dquot in %s.", __func__);
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
if (item->ri_buf[1].i_len < sizeof(xfs_disk_dquot_t)) {
|
||||
cmn_err(CE_ALERT,
|
||||
"XFS: dquot too small (%d) in %s.",
|
||||
xfs_alert(log->l_mp, "dquot too small (%d) in %s.",
|
||||
item->ri_buf[1].i_len, __func__);
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
|
@ -2498,12 +2501,10 @@ xlog_recover_dquot_pass2(
|
|||
*/
|
||||
dq_f = item->ri_buf[0].i_addr;
|
||||
ASSERT(dq_f);
|
||||
if ((error = xfs_qm_dqcheck(recddq,
|
||||
dq_f->qlf_id,
|
||||
0, XFS_QMOPT_DOWARN,
|
||||
"xlog_recover_dquot_pass2 (log copy)"))) {
|
||||
error = xfs_qm_dqcheck(mp, recddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN,
|
||||
"xlog_recover_dquot_pass2 (log copy)");
|
||||
if (error)
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
ASSERT(dq_f->qlf_len == 1);
|
||||
|
||||
error = xfs_read_buf(mp, mp->m_ddev_targp,
|
||||
|
@ -2523,8 +2524,9 @@ xlog_recover_dquot_pass2(
|
|||
* was among a chunk of dquots created earlier, and we did some
|
||||
* minimal initialization then.
|
||||
*/
|
||||
if (xfs_qm_dqcheck(ddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN,
|
||||
"xlog_recover_dquot_pass2")) {
|
||||
error = xfs_qm_dqcheck(mp, ddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN,
|
||||
"xlog_recover_dquot_pass2");
|
||||
if (error) {
|
||||
xfs_buf_relse(bp);
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
|
@ -2676,9 +2678,8 @@ xlog_recover_commit_pass1(
|
|||
/* nothing to do in pass 1 */
|
||||
return 0;
|
||||
default:
|
||||
xlog_warn(
|
||||
"XFS: invalid item type (%d) xlog_recover_commit_pass1",
|
||||
ITEM_TYPE(item));
|
||||
xfs_warn(log->l_mp, "%s: invalid item type (%d)",
|
||||
__func__, ITEM_TYPE(item));
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
|
@ -2707,9 +2708,8 @@ xlog_recover_commit_pass2(
|
|||
/* nothing to do in pass2 */
|
||||
return 0;
|
||||
default:
|
||||
xlog_warn(
|
||||
"XFS: invalid item type (%d) xlog_recover_commit_pass2",
|
||||
ITEM_TYPE(item));
|
||||
xfs_warn(log->l_mp, "%s: invalid item type (%d)",
|
||||
__func__, ITEM_TYPE(item));
|
||||
ASSERT(0);
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
|
@ -2751,10 +2751,11 @@ xlog_recover_commit_trans(
|
|||
|
||||
STATIC int
|
||||
xlog_recover_unmount_trans(
|
||||
struct log *log,
|
||||
xlog_recover_t *trans)
|
||||
{
|
||||
/* Do nothing now */
|
||||
xlog_warn("XFS: xlog_recover_unmount_trans: Unmount LR");
|
||||
xfs_warn(log->l_mp, "%s: Unmount LR", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2797,8 +2798,8 @@ xlog_recover_process_data(
|
|||
dp += sizeof(xlog_op_header_t);
|
||||
if (ohead->oh_clientid != XFS_TRANSACTION &&
|
||||
ohead->oh_clientid != XFS_LOG) {
|
||||
xlog_warn(
|
||||
"XFS: xlog_recover_process_data: bad clientid");
|
||||
xfs_warn(log->l_mp, "%s: bad clientid 0x%x",
|
||||
__func__, ohead->oh_clientid);
|
||||
ASSERT(0);
|
||||
return (XFS_ERROR(EIO));
|
||||
}
|
||||
|
@ -2811,8 +2812,8 @@ xlog_recover_process_data(
|
|||
be64_to_cpu(rhead->h_lsn));
|
||||
} else {
|
||||
if (dp + be32_to_cpu(ohead->oh_len) > lp) {
|
||||
xlog_warn(
|
||||
"XFS: xlog_recover_process_data: bad length");
|
||||
xfs_warn(log->l_mp, "%s: bad length 0x%x",
|
||||
__func__, be32_to_cpu(ohead->oh_len));
|
||||
WARN_ON(1);
|
||||
return (XFS_ERROR(EIO));
|
||||
}
|
||||
|
@ -2825,7 +2826,7 @@ xlog_recover_process_data(
|
|||
trans, pass);
|
||||
break;
|
||||
case XLOG_UNMOUNT_TRANS:
|
||||
error = xlog_recover_unmount_trans(trans);
|
||||
error = xlog_recover_unmount_trans(log, trans);
|
||||
break;
|
||||
case XLOG_WAS_CONT_TRANS:
|
||||
error = xlog_recover_add_to_cont_trans(log,
|
||||
|
@ -2833,8 +2834,8 @@ xlog_recover_process_data(
|
|||
be32_to_cpu(ohead->oh_len));
|
||||
break;
|
||||
case XLOG_START_TRANS:
|
||||
xlog_warn(
|
||||
"XFS: xlog_recover_process_data: bad transaction");
|
||||
xfs_warn(log->l_mp, "%s: bad transaction",
|
||||
__func__);
|
||||
ASSERT(0);
|
||||
error = XFS_ERROR(EIO);
|
||||
break;
|
||||
|
@ -2844,8 +2845,8 @@ xlog_recover_process_data(
|
|||
dp, be32_to_cpu(ohead->oh_len));
|
||||
break;
|
||||
default:
|
||||
xlog_warn(
|
||||
"XFS: xlog_recover_process_data: bad flag");
|
||||
xfs_warn(log->l_mp, "%s: bad flag 0x%x",
|
||||
__func__, flags);
|
||||
ASSERT(0);
|
||||
error = XFS_ERROR(EIO);
|
||||
break;
|
||||
|
@ -3030,8 +3031,7 @@ xlog_recover_clear_agi_bucket(
|
|||
out_abort:
|
||||
xfs_trans_cancel(tp, XFS_TRANS_ABORT);
|
||||
out_error:
|
||||
xfs_fs_cmn_err(CE_WARN, mp, "xlog_recover_clear_agi_bucket: "
|
||||
"failed to clear agi %d. Continuing.", agno);
|
||||
xfs_warn(mp, "%s: failed to clear agi %d. Continuing.", __func__, agno);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3282,7 +3282,7 @@ xlog_valid_rec_header(
|
|||
if (unlikely(
|
||||
(!rhead->h_version ||
|
||||
(be32_to_cpu(rhead->h_version) & (~XLOG_VERSION_OKBITS))))) {
|
||||
xlog_warn("XFS: %s: unrecognised log version (%d).",
|
||||
xfs_warn(log->l_mp, "%s: unrecognised log version (%d).",
|
||||
__func__, be32_to_cpu(rhead->h_version));
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
|
@ -3740,10 +3740,9 @@ xlog_recover(
|
|||
return error;
|
||||
}
|
||||
|
||||
cmn_err(CE_NOTE,
|
||||
"Starting XFS recovery on filesystem: %s (logdev: %s)",
|
||||
log->l_mp->m_fsname, log->l_mp->m_logname ?
|
||||
log->l_mp->m_logname : "internal");
|
||||
xfs_notice(log->l_mp, "Starting recovery (logdev: %s)",
|
||||
log->l_mp->m_logname ? log->l_mp->m_logname
|
||||
: "internal");
|
||||
|
||||
error = xlog_do_recover(log, head_blk, tail_blk);
|
||||
log->l_flags |= XLOG_RECOVERY_NEEDED;
|
||||
|
@ -3776,9 +3775,7 @@ xlog_recover_finish(
|
|||
int error;
|
||||
error = xlog_recover_process_efis(log);
|
||||
if (error) {
|
||||
cmn_err(CE_ALERT,
|
||||
"Failed to recover EFIs on filesystem: %s",
|
||||
log->l_mp->m_fsname);
|
||||
xfs_alert(log->l_mp, "Failed to recover EFIs");
|
||||
return error;
|
||||
}
|
||||
/*
|
||||
|
@ -3793,15 +3790,12 @@ xlog_recover_finish(
|
|||
|
||||
xlog_recover_check_summary(log);
|
||||
|
||||
cmn_err(CE_NOTE,
|
||||
"Ending XFS recovery on filesystem: %s (logdev: %s)",
|
||||
log->l_mp->m_fsname, log->l_mp->m_logname ?
|
||||
log->l_mp->m_logname : "internal");
|
||||
xfs_notice(log->l_mp, "Ending recovery (logdev: %s)",
|
||||
log->l_mp->m_logname ? log->l_mp->m_logname
|
||||
: "internal");
|
||||
log->l_flags &= ~XLOG_RECOVERY_NEEDED;
|
||||
} else {
|
||||
cmn_err(CE_DEBUG,
|
||||
"Ending clean XFS mount for filesystem: %s\n",
|
||||
log->l_mp->m_fsname);
|
||||
xfs_info(log->l_mp, "Ending clean mount");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -3834,10 +3828,8 @@ xlog_recover_check_summary(
|
|||
for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
|
||||
error = xfs_read_agf(mp, NULL, agno, 0, &agfbp);
|
||||
if (error) {
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xlog_recover_check_summary(agf)"
|
||||
"agf read failed agno %d error %d",
|
||||
agno, error);
|
||||
xfs_alert(mp, "%s agf read failed agno %d error %d",
|
||||
__func__, agno, error);
|
||||
} else {
|
||||
agfp = XFS_BUF_TO_AGF(agfbp);
|
||||
freeblks += be32_to_cpu(agfp->agf_freeblks) +
|
||||
|
@ -3846,7 +3838,10 @@ xlog_recover_check_summary(
|
|||
}
|
||||
|
||||
error = xfs_read_agi(mp, NULL, agno, &agibp);
|
||||
if (!error) {
|
||||
if (error) {
|
||||
xfs_alert(mp, "%s agi read failed agno %d error %d",
|
||||
__func__, agno, error);
|
||||
} else {
|
||||
struct xfs_agi *agi = XFS_BUF_TO_AGI(agibp);
|
||||
|
||||
itotal += be32_to_cpu(agi->agi_count);
|
||||
|
|
|
@ -133,9 +133,7 @@ xfs_uuid_mount(
|
|||
return 0;
|
||||
|
||||
if (uuid_is_nil(uuid)) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: Filesystem %s has nil UUID - can't mount",
|
||||
mp->m_fsname);
|
||||
xfs_warn(mp, "Filesystem has nil UUID - can't mount");
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
|
@ -163,8 +161,7 @@ xfs_uuid_mount(
|
|||
|
||||
out_duplicate:
|
||||
mutex_unlock(&xfs_uuid_table_mutex);
|
||||
cmn_err(CE_WARN, "XFS: Filesystem %s has duplicate UUID - can't mount",
|
||||
mp->m_fsname);
|
||||
xfs_warn(mp, "Filesystem has duplicate UUID - can't mount");
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
|
@ -311,6 +308,8 @@ xfs_mount_validate_sb(
|
|||
xfs_sb_t *sbp,
|
||||
int flags)
|
||||
{
|
||||
int loud = !(flags & XFS_MFSI_QUIET);
|
||||
|
||||
/*
|
||||
* If the log device and data device have the
|
||||
* same device number, the log is internal.
|
||||
|
@ -319,28 +318,32 @@ xfs_mount_validate_sb(
|
|||
* a volume filesystem in a non-volume manner.
|
||||
*/
|
||||
if (sbp->sb_magicnum != XFS_SB_MAGIC) {
|
||||
xfs_fs_mount_cmn_err(flags, "bad magic number");
|
||||
if (loud)
|
||||
xfs_warn(mp, "bad magic number");
|
||||
return XFS_ERROR(EWRONGFS);
|
||||
}
|
||||
|
||||
if (!xfs_sb_good_version(sbp)) {
|
||||
xfs_fs_mount_cmn_err(flags, "bad version");
|
||||
if (loud)
|
||||
xfs_warn(mp, "bad version");
|
||||
return XFS_ERROR(EWRONGFS);
|
||||
}
|
||||
|
||||
if (unlikely(
|
||||
sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) {
|
||||
xfs_fs_mount_cmn_err(flags,
|
||||
"filesystem is marked as having an external log; "
|
||||
"specify logdev on the\nmount command line.");
|
||||
if (loud)
|
||||
xfs_warn(mp,
|
||||
"filesystem is marked as having an external log; "
|
||||
"specify logdev on the mount command line.");
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
if (unlikely(
|
||||
sbp->sb_logstart != 0 && mp->m_logdev_targp != mp->m_ddev_targp)) {
|
||||
xfs_fs_mount_cmn_err(flags,
|
||||
"filesystem is marked as having an internal log; "
|
||||
"do not specify logdev on\nthe mount command line.");
|
||||
if (loud)
|
||||
xfs_warn(mp,
|
||||
"filesystem is marked as having an internal log; "
|
||||
"do not specify logdev on the mount command line.");
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
||||
|
@ -369,7 +372,8 @@ xfs_mount_validate_sb(
|
|||
(sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) ||
|
||||
(sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) ||
|
||||
(sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */))) {
|
||||
xfs_fs_mount_cmn_err(flags, "SB sanity check 1 failed");
|
||||
if (loud)
|
||||
xfs_warn(mp, "SB sanity check 1 failed");
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
|
@ -382,7 +386,8 @@ xfs_mount_validate_sb(
|
|||
(xfs_drfsbno_t)sbp->sb_agcount * sbp->sb_agblocks ||
|
||||
sbp->sb_dblocks < (xfs_drfsbno_t)(sbp->sb_agcount - 1) *
|
||||
sbp->sb_agblocks + XFS_MIN_AG_BLOCKS)) {
|
||||
xfs_fs_mount_cmn_err(flags, "SB sanity check 2 failed");
|
||||
if (loud)
|
||||
xfs_warn(mp, "SB sanity check 2 failed");
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
|
@ -390,12 +395,12 @@ xfs_mount_validate_sb(
|
|||
* Until this is fixed only page-sized or smaller data blocks work.
|
||||
*/
|
||||
if (unlikely(sbp->sb_blocksize > PAGE_SIZE)) {
|
||||
xfs_fs_mount_cmn_err(flags,
|
||||
"file system with blocksize %d bytes",
|
||||
sbp->sb_blocksize);
|
||||
xfs_fs_mount_cmn_err(flags,
|
||||
"only pagesize (%ld) or less will currently work.",
|
||||
PAGE_SIZE);
|
||||
if (loud) {
|
||||
xfs_warn(mp,
|
||||
"File system with blocksize %d bytes. "
|
||||
"Only pagesize (%ld) or less will currently work.",
|
||||
sbp->sb_blocksize, PAGE_SIZE);
|
||||
}
|
||||
return XFS_ERROR(ENOSYS);
|
||||
}
|
||||
|
||||
|
@ -409,21 +414,23 @@ xfs_mount_validate_sb(
|
|||
case 2048:
|
||||
break;
|
||||
default:
|
||||
xfs_fs_mount_cmn_err(flags,
|
||||
"inode size of %d bytes not supported",
|
||||
sbp->sb_inodesize);
|
||||
if (loud)
|
||||
xfs_warn(mp, "inode size of %d bytes not supported",
|
||||
sbp->sb_inodesize);
|
||||
return XFS_ERROR(ENOSYS);
|
||||
}
|
||||
|
||||
if (xfs_sb_validate_fsb_count(sbp, sbp->sb_dblocks) ||
|
||||
xfs_sb_validate_fsb_count(sbp, sbp->sb_rblocks)) {
|
||||
xfs_fs_mount_cmn_err(flags,
|
||||
"file system too large to be mounted on this system.");
|
||||
if (loud)
|
||||
xfs_warn(mp,
|
||||
"file system too large to be mounted on this system.");
|
||||
return XFS_ERROR(EFBIG);
|
||||
}
|
||||
|
||||
if (unlikely(sbp->sb_inprogress)) {
|
||||
xfs_fs_mount_cmn_err(flags, "file system busy");
|
||||
if (loud)
|
||||
xfs_warn(mp, "file system busy");
|
||||
return XFS_ERROR(EFSCORRUPTED);
|
||||
}
|
||||
|
||||
|
@ -431,8 +438,9 @@ xfs_mount_validate_sb(
|
|||
* Version 1 directory format has never worked on Linux.
|
||||
*/
|
||||
if (unlikely(!xfs_sb_version_hasdirv2(sbp))) {
|
||||
xfs_fs_mount_cmn_err(flags,
|
||||
"file system using version 1 directory format");
|
||||
if (loud)
|
||||
xfs_warn(mp,
|
||||
"file system using version 1 directory format");
|
||||
return XFS_ERROR(ENOSYS);
|
||||
}
|
||||
|
||||
|
@ -673,6 +681,7 @@ xfs_readsb(xfs_mount_t *mp, int flags)
|
|||
unsigned int sector_size;
|
||||
xfs_buf_t *bp;
|
||||
int error;
|
||||
int loud = !(flags & XFS_MFSI_QUIET);
|
||||
|
||||
ASSERT(mp->m_sb_bp == NULL);
|
||||
ASSERT(mp->m_ddev_targp != NULL);
|
||||
|
@ -688,7 +697,8 @@ reread:
|
|||
bp = xfs_buf_read_uncached(mp, mp->m_ddev_targp,
|
||||
XFS_SB_DADDR, sector_size, 0);
|
||||
if (!bp) {
|
||||
xfs_fs_mount_cmn_err(flags, "SB buffer read failed");
|
||||
if (loud)
|
||||
xfs_warn(mp, "SB buffer read failed");
|
||||
return EIO;
|
||||
}
|
||||
|
||||
|
@ -699,7 +709,8 @@ reread:
|
|||
xfs_sb_from_disk(&mp->m_sb, XFS_BUF_TO_SBP(bp));
|
||||
error = xfs_mount_validate_sb(mp, &(mp->m_sb), flags);
|
||||
if (error) {
|
||||
xfs_fs_mount_cmn_err(flags, "SB validate failed");
|
||||
if (loud)
|
||||
xfs_warn(mp, "SB validate failed");
|
||||
goto release_buf;
|
||||
}
|
||||
|
||||
|
@ -707,9 +718,9 @@ reread:
|
|||
* We must be able to do sector-sized and sector-aligned IO.
|
||||
*/
|
||||
if (sector_size > mp->m_sb.sb_sectsize) {
|
||||
xfs_fs_mount_cmn_err(flags,
|
||||
"device supports only %u byte sectors (not %u)",
|
||||
sector_size, mp->m_sb.sb_sectsize);
|
||||
if (loud)
|
||||
xfs_warn(mp, "device supports %u byte sectors (not %u)",
|
||||
sector_size, mp->m_sb.sb_sectsize);
|
||||
error = ENOSYS;
|
||||
goto release_buf;
|
||||
}
|
||||
|
@ -853,8 +864,7 @@ xfs_update_alignment(xfs_mount_t *mp)
|
|||
if ((BBTOB(mp->m_dalign) & mp->m_blockmask) ||
|
||||
(BBTOB(mp->m_swidth) & mp->m_blockmask)) {
|
||||
if (mp->m_flags & XFS_MOUNT_RETERR) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: alignment check 1 failed");
|
||||
xfs_warn(mp, "alignment check 1 failed");
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
mp->m_dalign = mp->m_swidth = 0;
|
||||
|
@ -867,8 +877,9 @@ xfs_update_alignment(xfs_mount_t *mp)
|
|||
if (mp->m_flags & XFS_MOUNT_RETERR) {
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"stripe alignment turned off: sunit(%d)/swidth(%d) incompatible with agsize(%d)",
|
||||
xfs_warn(mp,
|
||||
"stripe alignment turned off: sunit(%d)/swidth(%d) "
|
||||
"incompatible with agsize(%d)",
|
||||
mp->m_dalign, mp->m_swidth,
|
||||
sbp->sb_agblocks);
|
||||
|
||||
|
@ -878,9 +889,9 @@ xfs_update_alignment(xfs_mount_t *mp)
|
|||
mp->m_swidth = XFS_BB_TO_FSBT(mp, mp->m_swidth);
|
||||
} else {
|
||||
if (mp->m_flags & XFS_MOUNT_RETERR) {
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"stripe alignment turned off: sunit(%d) less than bsize(%d)",
|
||||
mp->m_dalign,
|
||||
xfs_warn(mp,
|
||||
"stripe alignment turned off: sunit(%d) less than bsize(%d)",
|
||||
mp->m_dalign,
|
||||
mp->m_blockmask +1);
|
||||
return XFS_ERROR(EINVAL);
|
||||
}
|
||||
|
@ -1026,14 +1037,14 @@ xfs_check_sizes(xfs_mount_t *mp)
|
|||
|
||||
d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks);
|
||||
if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_dblocks) {
|
||||
cmn_err(CE_WARN, "XFS: filesystem size mismatch detected");
|
||||
xfs_warn(mp, "filesystem size mismatch detected");
|
||||
return XFS_ERROR(EFBIG);
|
||||
}
|
||||
bp = xfs_buf_read_uncached(mp, mp->m_ddev_targp,
|
||||
d - XFS_FSS_TO_BB(mp, 1),
|
||||
BBTOB(XFS_FSS_TO_BB(mp, 1)), 0);
|
||||
if (!bp) {
|
||||
cmn_err(CE_WARN, "XFS: last sector read failed");
|
||||
xfs_warn(mp, "last sector read failed");
|
||||
return EIO;
|
||||
}
|
||||
xfs_buf_relse(bp);
|
||||
|
@ -1041,14 +1052,14 @@ xfs_check_sizes(xfs_mount_t *mp)
|
|||
if (mp->m_logdev_targp != mp->m_ddev_targp) {
|
||||
d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks);
|
||||
if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) {
|
||||
cmn_err(CE_WARN, "XFS: log size mismatch detected");
|
||||
xfs_warn(mp, "log size mismatch detected");
|
||||
return XFS_ERROR(EFBIG);
|
||||
}
|
||||
bp = xfs_buf_read_uncached(mp, mp->m_logdev_targp,
|
||||
d - XFS_FSB_TO_BB(mp, 1),
|
||||
XFS_FSB_TO_B(mp, 1), 0);
|
||||
if (!bp) {
|
||||
cmn_err(CE_WARN, "XFS: log device read failed");
|
||||
xfs_warn(mp, "log device read failed");
|
||||
return EIO;
|
||||
}
|
||||
xfs_buf_relse(bp);
|
||||
|
@ -1086,7 +1097,7 @@ xfs_mount_reset_sbqflags(
|
|||
return 0;
|
||||
|
||||
#ifdef QUOTADEBUG
|
||||
xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes");
|
||||
xfs_notice(mp, "Writing superblock quota changes");
|
||||
#endif
|
||||
|
||||
tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE);
|
||||
|
@ -1094,8 +1105,7 @@ xfs_mount_reset_sbqflags(
|
|||
XFS_DEFAULT_LOG_COUNT);
|
||||
if (error) {
|
||||
xfs_trans_cancel(tp, 0);
|
||||
xfs_fs_cmn_err(CE_ALERT, mp,
|
||||
"xfs_mount_reset_sbqflags: Superblock update failed!");
|
||||
xfs_alert(mp, "%s: Superblock update failed!", __func__);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -1161,8 +1171,7 @@ xfs_mountfs(
|
|||
* transaction subsystem is online.
|
||||
*/
|
||||
if (xfs_sb_has_mismatched_features2(sbp)) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: correcting sb_features alignment problem");
|
||||
xfs_warn(mp, "correcting sb_features alignment problem");
|
||||
sbp->sb_features2 |= sbp->sb_bad_features2;
|
||||
sbp->sb_bad_features2 = sbp->sb_features2;
|
||||
mp->m_update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2;
|
||||
|
@ -1241,7 +1250,7 @@ xfs_mountfs(
|
|||
*/
|
||||
error = xfs_rtmount_init(mp);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS: RT mount failed");
|
||||
xfs_warn(mp, "RT mount failed");
|
||||
goto out_remove_uuid;
|
||||
}
|
||||
|
||||
|
@ -1272,12 +1281,12 @@ xfs_mountfs(
|
|||
INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC);
|
||||
error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS: Failed per-ag init: %d", error);
|
||||
xfs_warn(mp, "Failed per-ag init: %d", error);
|
||||
goto out_remove_uuid;
|
||||
}
|
||||
|
||||
if (!sbp->sb_logblocks) {
|
||||
cmn_err(CE_WARN, "XFS: no log defined");
|
||||
xfs_warn(mp, "no log defined");
|
||||
XFS_ERROR_REPORT("xfs_mountfs", XFS_ERRLEVEL_LOW, mp);
|
||||
error = XFS_ERROR(EFSCORRUPTED);
|
||||
goto out_free_perag;
|
||||
|
@ -1290,7 +1299,7 @@ xfs_mountfs(
|
|||
XFS_FSB_TO_DADDR(mp, sbp->sb_logstart),
|
||||
XFS_FSB_TO_BB(mp, sbp->sb_logblocks));
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS: log mount failed");
|
||||
xfs_warn(mp, "log mount failed");
|
||||
goto out_free_perag;
|
||||
}
|
||||
|
||||
|
@ -1327,16 +1336,14 @@ xfs_mountfs(
|
|||
*/
|
||||
error = xfs_iget(mp, NULL, sbp->sb_rootino, 0, XFS_ILOCK_EXCL, &rip);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS: failed to read root inode");
|
||||
xfs_warn(mp, "failed to read root inode");
|
||||
goto out_log_dealloc;
|
||||
}
|
||||
|
||||
ASSERT(rip != NULL);
|
||||
|
||||
if (unlikely((rip->i_d.di_mode & S_IFMT) != S_IFDIR)) {
|
||||
cmn_err(CE_WARN, "XFS: corrupted root inode");
|
||||
cmn_err(CE_WARN, "Device %s - root %llu is not a directory",
|
||||
XFS_BUFTARG_NAME(mp->m_ddev_targp),
|
||||
xfs_warn(mp, "corrupted root inode %llu: not a directory",
|
||||
(unsigned long long)rip->i_ino);
|
||||
xfs_iunlock(rip, XFS_ILOCK_EXCL);
|
||||
XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW,
|
||||
|
@ -1356,7 +1363,7 @@ xfs_mountfs(
|
|||
/*
|
||||
* Free up the root inode.
|
||||
*/
|
||||
cmn_err(CE_WARN, "XFS: failed to read RT inodes");
|
||||
xfs_warn(mp, "failed to read RT inodes");
|
||||
goto out_rele_rip;
|
||||
}
|
||||
|
||||
|
@ -1368,7 +1375,7 @@ xfs_mountfs(
|
|||
if (mp->m_update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) {
|
||||
error = xfs_mount_log_sb(mp, mp->m_update_flags);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS: failed to write sb changes");
|
||||
xfs_warn(mp, "failed to write sb changes");
|
||||
goto out_rtunmount;
|
||||
}
|
||||
}
|
||||
|
@ -1389,10 +1396,7 @@ xfs_mountfs(
|
|||
* quotachecked license.
|
||||
*/
|
||||
if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) {
|
||||
cmn_err(CE_NOTE,
|
||||
"XFS: resetting qflags for filesystem %s",
|
||||
mp->m_fsname);
|
||||
|
||||
xfs_notice(mp, "resetting quota flags");
|
||||
error = xfs_mount_reset_sbqflags(mp);
|
||||
if (error)
|
||||
return error;
|
||||
|
@ -1406,7 +1410,7 @@ xfs_mountfs(
|
|||
*/
|
||||
error = xfs_log_mount_finish(mp);
|
||||
if (error) {
|
||||
cmn_err(CE_WARN, "XFS: log mount finish failed");
|
||||
xfs_warn(mp, "log mount finish failed");
|
||||
goto out_rtunmount;
|
||||
}
|
||||
|
||||
|
@ -1435,8 +1439,8 @@ xfs_mountfs(
|
|||
resblks = xfs_default_resblks(mp);
|
||||
error = xfs_reserve_blocks(mp, &resblks, NULL);
|
||||
if (error)
|
||||
cmn_err(CE_WARN, "XFS: Unable to allocate reserve "
|
||||
"blocks. Continuing without a reserve pool.");
|
||||
xfs_warn(mp,
|
||||
"Unable to allocate reserve blocks. Continuing without reserve pool.");
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1525,12 +1529,12 @@ xfs_unmountfs(
|
|||
resblks = 0;
|
||||
error = xfs_reserve_blocks(mp, &resblks, NULL);
|
||||
if (error)
|
||||
cmn_err(CE_WARN, "XFS: Unable to free reserved block pool. "
|
||||
xfs_warn(mp, "Unable to free reserved block pool. "
|
||||
"Freespace may not be correct on next mount.");
|
||||
|
||||
error = xfs_log_sbcount(mp, 1);
|
||||
if (error)
|
||||
cmn_err(CE_WARN, "XFS: Unable to update superblock counters. "
|
||||
xfs_warn(mp, "Unable to update superblock counters. "
|
||||
"Freespace may not be correct on next mount.");
|
||||
xfs_unmountfs_writesb(mp);
|
||||
xfs_unmountfs_wait(mp); /* wait for async bufs */
|
||||
|
@ -2013,10 +2017,8 @@ xfs_dev_is_read_only(
|
|||
if (xfs_readonly_buftarg(mp->m_ddev_targp) ||
|
||||
xfs_readonly_buftarg(mp->m_logdev_targp) ||
|
||||
(mp->m_rtdev_targp && xfs_readonly_buftarg(mp->m_rtdev_targp))) {
|
||||
cmn_err(CE_NOTE,
|
||||
"XFS: %s required on read-only device.", message);
|
||||
cmn_err(CE_NOTE,
|
||||
"XFS: write access unavailable, cannot proceed.");
|
||||
xfs_notice(mp, "%s required on read-only device.", message);
|
||||
xfs_notice(mp, "write access unavailable, cannot proceed.");
|
||||
return EROFS;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -382,7 +382,8 @@ static inline int xfs_qm_sync(struct xfs_mount *mp, int flags)
|
|||
xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \
|
||||
f | XFS_QMOPT_RES_REGBLKS)
|
||||
|
||||
extern int xfs_qm_dqcheck(xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *);
|
||||
extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *,
|
||||
xfs_dqid_t, uint, uint, char *);
|
||||
extern int xfs_mount_reset_sbqflags(struct xfs_mount *);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
|
|
@ -76,7 +76,7 @@ xfs_growfs_rt_alloc(
|
|||
xfs_mount_t *mp, /* file system mount point */
|
||||
xfs_extlen_t oblocks, /* old count of blocks */
|
||||
xfs_extlen_t nblocks, /* new count of blocks */
|
||||
xfs_ino_t ino) /* inode number (bitmap/summary) */
|
||||
xfs_inode_t *ip) /* inode (bitmap/summary) */
|
||||
{
|
||||
xfs_fileoff_t bno; /* block number in file */
|
||||
xfs_buf_t *bp; /* temporary buffer for zeroing */
|
||||
|
@ -86,7 +86,6 @@ xfs_growfs_rt_alloc(
|
|||
xfs_fsblock_t firstblock; /* first block allocated in xaction */
|
||||
xfs_bmap_free_t flist; /* list of freed blocks */
|
||||
xfs_fsblock_t fsbno; /* filesystem block for bno */
|
||||
xfs_inode_t *ip; /* pointer to incore inode */
|
||||
xfs_bmbt_irec_t map; /* block map output */
|
||||
int nmap; /* number of block maps */
|
||||
int resblks; /* space reservation */
|
||||
|
@ -112,9 +111,9 @@ xfs_growfs_rt_alloc(
|
|||
/*
|
||||
* Lock the inode.
|
||||
*/
|
||||
if ((error = xfs_trans_iget(mp, tp, ino, 0,
|
||||
XFS_ILOCK_EXCL, &ip)))
|
||||
goto error_cancel;
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL);
|
||||
|
||||
xfs_bmap_init(&flist, &firstblock);
|
||||
/*
|
||||
* Allocate blocks to the bitmap file.
|
||||
|
@ -155,9 +154,8 @@ xfs_growfs_rt_alloc(
|
|||
/*
|
||||
* Lock the bitmap inode.
|
||||
*/
|
||||
if ((error = xfs_trans_iget(mp, tp, ino, 0,
|
||||
XFS_ILOCK_EXCL, &ip)))
|
||||
goto error_cancel;
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL);
|
||||
/*
|
||||
* Get a buffer for the block.
|
||||
*/
|
||||
|
@ -1854,7 +1852,6 @@ xfs_growfs_rt(
|
|||
xfs_rtblock_t bmbno; /* bitmap block number */
|
||||
xfs_buf_t *bp; /* temporary buffer */
|
||||
int error; /* error return value */
|
||||
xfs_inode_t *ip; /* bitmap inode, used as lock */
|
||||
xfs_mount_t *nmp; /* new (fake) mount structure */
|
||||
xfs_drfsbno_t nrblocks; /* new number of realtime blocks */
|
||||
xfs_extlen_t nrbmblocks; /* new number of rt bitmap blocks */
|
||||
|
@ -1918,11 +1915,11 @@ xfs_growfs_rt(
|
|||
/*
|
||||
* Allocate space to the bitmap and summary files, as necessary.
|
||||
*/
|
||||
if ((error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks,
|
||||
mp->m_sb.sb_rbmino)))
|
||||
error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks, mp->m_rbmip);
|
||||
if (error)
|
||||
return error;
|
||||
if ((error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks,
|
||||
mp->m_sb.sb_rsumino)))
|
||||
error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks, mp->m_rsumip);
|
||||
if (error)
|
||||
return error;
|
||||
/*
|
||||
* Allocate a new (fake) mount/sb.
|
||||
|
@ -1972,10 +1969,8 @@ xfs_growfs_rt(
|
|||
/*
|
||||
* Lock out other callers by grabbing the bitmap inode lock.
|
||||
*/
|
||||
if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0,
|
||||
XFS_ILOCK_EXCL, &ip)))
|
||||
goto error_cancel;
|
||||
ASSERT(ip == mp->m_rbmip);
|
||||
xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin_ref(tp, mp->m_rbmip, XFS_ILOCK_EXCL);
|
||||
/*
|
||||
* Update the bitmap inode's size.
|
||||
*/
|
||||
|
@ -1986,10 +1981,8 @@ xfs_growfs_rt(
|
|||
/*
|
||||
* Get the summary inode into the transaction.
|
||||
*/
|
||||
if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino, 0,
|
||||
XFS_ILOCK_EXCL, &ip)))
|
||||
goto error_cancel;
|
||||
ASSERT(ip == mp->m_rsumip);
|
||||
xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin_ref(tp, mp->m_rsumip, XFS_ILOCK_EXCL);
|
||||
/*
|
||||
* Update the summary inode's size.
|
||||
*/
|
||||
|
@ -2075,15 +2068,15 @@ xfs_rtallocate_extent(
|
|||
xfs_extlen_t prod, /* extent product factor */
|
||||
xfs_rtblock_t *rtblock) /* out: start block allocated */
|
||||
{
|
||||
xfs_mount_t *mp = tp->t_mountp;
|
||||
int error; /* error value */
|
||||
xfs_inode_t *ip; /* inode for bitmap file */
|
||||
xfs_mount_t *mp; /* file system mount structure */
|
||||
xfs_rtblock_t r; /* result allocated block */
|
||||
xfs_fsblock_t sb; /* summary file block number */
|
||||
xfs_buf_t *sumbp; /* summary file block buffer */
|
||||
|
||||
ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL));
|
||||
ASSERT(minlen > 0 && minlen <= maxlen);
|
||||
mp = tp->t_mountp;
|
||||
|
||||
/*
|
||||
* If prod is set then figure out what to do to minlen and maxlen.
|
||||
*/
|
||||
|
@ -2099,12 +2092,7 @@ xfs_rtallocate_extent(
|
|||
return 0;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Lock out other callers by grabbing the bitmap inode lock.
|
||||
*/
|
||||
if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0,
|
||||
XFS_ILOCK_EXCL, &ip)))
|
||||
return error;
|
||||
|
||||
sumbp = NULL;
|
||||
/*
|
||||
* Allocate by size, or near another block, or exactly at some block.
|
||||
|
@ -2123,11 +2111,12 @@ xfs_rtallocate_extent(
|
|||
len, &sumbp, &sb, prod, &r);
|
||||
break;
|
||||
default:
|
||||
error = EIO;
|
||||
ASSERT(0);
|
||||
}
|
||||
if (error) {
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* If it worked, update the superblock.
|
||||
*/
|
||||
|
@ -2155,7 +2144,6 @@ xfs_rtfree_extent(
|
|||
xfs_extlen_t len) /* length of extent freed */
|
||||
{
|
||||
int error; /* error value */
|
||||
xfs_inode_t *ip; /* bitmap file inode */
|
||||
xfs_mount_t *mp; /* file system mount structure */
|
||||
xfs_fsblock_t sb; /* summary file block number */
|
||||
xfs_buf_t *sumbp; /* summary file block buffer */
|
||||
|
@ -2164,9 +2152,9 @@ xfs_rtfree_extent(
|
|||
/*
|
||||
* Synchronize by locking the bitmap inode.
|
||||
*/
|
||||
if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0,
|
||||
XFS_ILOCK_EXCL, &ip)))
|
||||
return error;
|
||||
xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL);
|
||||
xfs_trans_ijoin_ref(tp, mp->m_rbmip, XFS_ILOCK_EXCL);
|
||||
|
||||
#if defined(__KERNEL__) && defined(DEBUG)
|
||||
/*
|
||||
* Check to see that this whole range is currently allocated.
|
||||
|
@ -2199,10 +2187,10 @@ xfs_rtfree_extent(
|
|||
*/
|
||||
if (tp->t_frextents_delta + mp->m_sb.sb_frextents ==
|
||||
mp->m_sb.sb_rextents) {
|
||||
if (!(ip->i_d.di_flags & XFS_DIFLAG_NEWRTBM))
|
||||
ip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM;
|
||||
*(__uint64_t *)&ip->i_d.di_atime = 0;
|
||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
||||
if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM))
|
||||
mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM;
|
||||
*(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0;
|
||||
xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -2222,8 +2210,8 @@ xfs_rtmount_init(
|
|||
if (sbp->sb_rblocks == 0)
|
||||
return 0;
|
||||
if (mp->m_rtdev_targp == NULL) {
|
||||
cmn_err(CE_WARN,
|
||||
"XFS: This filesystem has a realtime volume, use rtdev=device option");
|
||||
xfs_warn(mp,
|
||||
"Filesystem has a realtime volume, use rtdev=device option");
|
||||
return XFS_ERROR(ENODEV);
|
||||
}
|
||||
mp->m_rsumlevels = sbp->sb_rextslog + 1;
|
||||
|
@ -2237,7 +2225,7 @@ xfs_rtmount_init(
|
|||
*/
|
||||
d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks);
|
||||
if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_rblocks) {
|
||||
cmn_err(CE_WARN, "XFS: realtime mount -- %llu != %llu",
|
||||
xfs_warn(mp, "realtime mount -- %llu != %llu",
|
||||
(unsigned long long) XFS_BB_TO_FSB(mp, d),
|
||||
(unsigned long long) mp->m_sb.sb_rblocks);
|
||||
return XFS_ERROR(EFBIG);
|
||||
|
@ -2246,7 +2234,7 @@ xfs_rtmount_init(
|
|||
d - XFS_FSB_TO_BB(mp, 1),
|
||||
XFS_FSB_TO_B(mp, 1), 0);
|
||||
if (!bp) {
|
||||
cmn_err(CE_WARN, "XFS: realtime device size check failed");
|
||||
xfs_warn(mp, "realtime device size check failed");
|
||||
return EIO;
|
||||
}
|
||||
xfs_buf_relse(bp);
|
||||
|
@ -2306,20 +2294,16 @@ xfs_rtpick_extent(
|
|||
xfs_rtblock_t *pick) /* result rt extent */
|
||||
{
|
||||
xfs_rtblock_t b; /* result block */
|
||||
int error; /* error return value */
|
||||
xfs_inode_t *ip; /* bitmap incore inode */
|
||||
int log2; /* log of sequence number */
|
||||
__uint64_t resid; /* residual after log removed */
|
||||
__uint64_t seq; /* sequence number of file creation */
|
||||
__uint64_t *seqp; /* pointer to seqno in inode */
|
||||
|
||||
if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0,
|
||||
XFS_ILOCK_EXCL, &ip)))
|
||||
return error;
|
||||
ASSERT(ip == mp->m_rbmip);
|
||||
seqp = (__uint64_t *)&ip->i_d.di_atime;
|
||||
if (!(ip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) {
|
||||
ip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM;
|
||||
ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL));
|
||||
|
||||
seqp = (__uint64_t *)&mp->m_rbmip->i_d.di_atime;
|
||||
if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) {
|
||||
mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM;
|
||||
*seqp = 0;
|
||||
}
|
||||
seq = *seqp;
|
||||
|
@ -2335,7 +2319,7 @@ xfs_rtpick_extent(
|
|||
b = mp->m_sb.sb_rextents - len;
|
||||
}
|
||||
*seqp = seq + 1;
|
||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
||||
xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE);
|
||||
*pick = b;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -154,7 +154,7 @@ xfs_rtmount_init(
|
|||
if (mp->m_sb.sb_rblocks == 0)
|
||||
return 0;
|
||||
|
||||
cmn_err(CE_WARN, "XFS: Not built with CONFIG_XFS_RT");
|
||||
xfs_warn(mp, "Not built with CONFIG_XFS_RT");
|
||||
return ENOSYS;
|
||||
}
|
||||
# define xfs_rtmount_inodes(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS))
|
||||
|
|
|
@ -49,9 +49,9 @@ xfs_do_force_shutdown(
|
|||
logerror = flags & SHUTDOWN_LOG_IO_ERROR;
|
||||
|
||||
if (!(flags & SHUTDOWN_FORCE_UMOUNT)) {
|
||||
cmn_err(CE_NOTE, "xfs_force_shutdown(%s,0x%x) called from "
|
||||
"line %d of file %s. Return address = 0x%p",
|
||||
mp->m_fsname, flags, lnnum, fname, __return_address);
|
||||
xfs_notice(mp,
|
||||
"%s(0x%x) called from line %d of file %s. Return address = 0x%p",
|
||||
__func__, flags, lnnum, fname, __return_address);
|
||||
}
|
||||
/*
|
||||
* No need to duplicate efforts.
|
||||
|
@ -69,30 +69,25 @@ xfs_do_force_shutdown(
|
|||
return;
|
||||
|
||||
if (flags & SHUTDOWN_CORRUPT_INCORE) {
|
||||
xfs_cmn_err(XFS_PTAG_SHUTDOWN_CORRUPT, CE_ALERT, mp,
|
||||
"Corruption of in-memory data detected. Shutting down filesystem: %s",
|
||||
mp->m_fsname);
|
||||
if (XFS_ERRLEVEL_HIGH <= xfs_error_level) {
|
||||
xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_CORRUPT,
|
||||
"Corruption of in-memory data detected. Shutting down filesystem");
|
||||
if (XFS_ERRLEVEL_HIGH <= xfs_error_level)
|
||||
xfs_stack_trace();
|
||||
}
|
||||
} else if (!(flags & SHUTDOWN_FORCE_UMOUNT)) {
|
||||
if (logerror) {
|
||||
xfs_cmn_err(XFS_PTAG_SHUTDOWN_LOGERROR, CE_ALERT, mp,
|
||||
"Log I/O Error Detected. Shutting down filesystem: %s",
|
||||
mp->m_fsname);
|
||||
xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_LOGERROR,
|
||||
"Log I/O Error Detected. Shutting down filesystem");
|
||||
} else if (flags & SHUTDOWN_DEVICE_REQ) {
|
||||
xfs_cmn_err(XFS_PTAG_SHUTDOWN_IOERROR, CE_ALERT, mp,
|
||||
"All device paths lost. Shutting down filesystem: %s",
|
||||
mp->m_fsname);
|
||||
xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_IOERROR,
|
||||
"All device paths lost. Shutting down filesystem");
|
||||
} else if (!(flags & SHUTDOWN_REMOTE_REQ)) {
|
||||
xfs_cmn_err(XFS_PTAG_SHUTDOWN_IOERROR, CE_ALERT, mp,
|
||||
"I/O Error Detected. Shutting down filesystem: %s",
|
||||
mp->m_fsname);
|
||||
xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_IOERROR,
|
||||
"I/O Error Detected. Shutting down filesystem");
|
||||
}
|
||||
}
|
||||
if (!(flags & SHUTDOWN_FORCE_UMOUNT)) {
|
||||
cmn_err(CE_ALERT, "Please umount the filesystem, "
|
||||
"and rectify the problem(s)");
|
||||
xfs_alert(mp,
|
||||
"Please umount the filesystem and rectify the problem(s)");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -106,10 +101,9 @@ xfs_ioerror_alert(
|
|||
xfs_buf_t *bp,
|
||||
xfs_daddr_t blkno)
|
||||
{
|
||||
cmn_err(CE_ALERT,
|
||||
"I/O error in filesystem (\"%s\") meta-data dev %s block 0x%llx"
|
||||
" (\"%s\") error %d buf count %zd",
|
||||
(!mp || !mp->m_fsname) ? "(fs name not set)" : mp->m_fsname,
|
||||
xfs_alert(mp,
|
||||
"I/O error occurred: meta-data dev %s block 0x%llx"
|
||||
" (\"%s\") error %d buf count %zd",
|
||||
XFS_BUFTARG_NAME(XFS_BUF_TARGET(bp)),
|
||||
(__uint64_t)blkno, func,
|
||||
XFS_BUF_GETERROR(bp), XFS_BUF_COUNT(bp));
|
||||
|
@ -173,17 +167,9 @@ xfs_extlen_t
|
|||
xfs_get_extsz_hint(
|
||||
struct xfs_inode *ip)
|
||||
{
|
||||
xfs_extlen_t extsz;
|
||||
|
||||
if (unlikely(XFS_IS_REALTIME_INODE(ip))) {
|
||||
extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE)
|
||||
? ip->i_d.di_extsize
|
||||
: ip->i_mount->m_sb.sb_rextsize;
|
||||
ASSERT(extsz);
|
||||
} else {
|
||||
extsz = (ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE)
|
||||
? ip->i_d.di_extsize : 0;
|
||||
}
|
||||
|
||||
return extsz;
|
||||
if ((ip->i_d.di_flags & XFS_DIFLAG_EXTSIZE) && ip->i_d.di_extsize)
|
||||
return ip->i_d.di_extsize;
|
||||
if (XFS_IS_REALTIME_INODE(ip))
|
||||
return ip->i_mount->m_sb.sb_rextsize;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -469,8 +469,6 @@ void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf *);
|
|||
void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *);
|
||||
void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint);
|
||||
void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *);
|
||||
int xfs_trans_iget(struct xfs_mount *, xfs_trans_t *,
|
||||
xfs_ino_t , uint, uint, struct xfs_inode **);
|
||||
void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int);
|
||||
void xfs_trans_ijoin_ref(struct xfs_trans *, struct xfs_inode *, uint);
|
||||
void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *);
|
||||
|
|
|
@ -563,7 +563,7 @@ xfs_trans_ail_delete_bulk(
|
|||
|
||||
spin_unlock(&ailp->xa_lock);
|
||||
if (!XFS_FORCED_SHUTDOWN(mp)) {
|
||||
xfs_cmn_err(XFS_PTAG_AILDELETE, CE_ALERT, mp,
|
||||
xfs_alert_tag(mp, XFS_PTAG_AILDELETE,
|
||||
"%s: attempting to delete a log item that is not in the AIL",
|
||||
__func__);
|
||||
xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
|
||||
|
|
|
@ -305,7 +305,7 @@ xfs_trans_read_buf(
|
|||
if (xfs_error_target == target) {
|
||||
if (((xfs_req_num++) % xfs_error_mod) == 0) {
|
||||
xfs_buf_relse(bp);
|
||||
cmn_err(CE_DEBUG, "Returning error!\n");
|
||||
xfs_debug(mp, "Returning error!");
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
}
|
||||
|
@ -403,7 +403,7 @@ xfs_trans_read_buf(
|
|||
xfs_force_shutdown(tp->t_mountp,
|
||||
SHUTDOWN_META_IO_ERROR);
|
||||
xfs_buf_relse(bp);
|
||||
cmn_err(CE_DEBUG, "Returning trans error!\n");
|
||||
xfs_debug(mp, "Returning trans error!");
|
||||
return XFS_ERROR(EIO);
|
||||
}
|
||||
}
|
||||
|
@ -427,7 +427,7 @@ shutdown_abort:
|
|||
*/
|
||||
#if defined(DEBUG)
|
||||
if (XFS_BUF_ISSTALE(bp) && XFS_BUF_ISDELAYWRITE(bp))
|
||||
cmn_err(CE_NOTE, "about to pop assert, bp == 0x%p", bp);
|
||||
xfs_notice(mp, "about to pop assert, bp == 0x%p", bp);
|
||||
#endif
|
||||
ASSERT((XFS_BUF_BFLAGS(bp) & (XBF_STALE|XBF_DELWRI)) !=
|
||||
(XBF_STALE|XBF_DELWRI));
|
||||
|
|
|
@ -43,28 +43,6 @@ xfs_trans_inode_broot_debug(
|
|||
#define xfs_trans_inode_broot_debug(ip)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Get an inode and join it to the transaction.
|
||||
*/
|
||||
int
|
||||
xfs_trans_iget(
|
||||
xfs_mount_t *mp,
|
||||
xfs_trans_t *tp,
|
||||
xfs_ino_t ino,
|
||||
uint flags,
|
||||
uint lock_flags,
|
||||
xfs_inode_t **ipp)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = xfs_iget(mp, tp, ino, flags, lock_flags, ipp);
|
||||
if (!error && tp) {
|
||||
xfs_trans_ijoin(tp, *ipp);
|
||||
(*ipp)->i_itemp->ili_lock_flags = lock_flags;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add a locked inode to the transaction.
|
||||
*
|
||||
|
|
|
@ -1189,9 +1189,8 @@ xfs_inactive(
|
|||
* inode might be lost for a long time or forever.
|
||||
*/
|
||||
if (!XFS_FORCED_SHUTDOWN(mp)) {
|
||||
cmn_err(CE_NOTE,
|
||||
"xfs_inactive: xfs_ifree() returned an error = %d on %s",
|
||||
error, mp->m_fsname);
|
||||
xfs_notice(mp, "%s: xfs_ifree returned error %d",
|
||||
__func__, error);
|
||||
xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR);
|
||||
}
|
||||
xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT);
|
||||
|
@ -1208,12 +1207,12 @@ xfs_inactive(
|
|||
*/
|
||||
error = xfs_bmap_finish(&tp, &free_list, &committed);
|
||||
if (error)
|
||||
xfs_fs_cmn_err(CE_NOTE, mp, "xfs_inactive: "
|
||||
"xfs_bmap_finish() returned error %d", error);
|
||||
xfs_notice(mp, "%s: xfs_bmap_finish returned error %d",
|
||||
__func__, error);
|
||||
error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
|
||||
if (error)
|
||||
xfs_fs_cmn_err(CE_NOTE, mp, "xfs_inactive: "
|
||||
"xfs_trans_commit() returned error %d", error);
|
||||
xfs_notice(mp, "%s: xfs_trans_commit returned error %d",
|
||||
__func__, error);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1310,7 +1309,7 @@ xfs_create(
|
|||
error = xfs_qm_vop_dqalloc(dp, current_fsuid(), current_fsgid(), prid,
|
||||
XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp);
|
||||
if (error)
|
||||
goto std_return;
|
||||
return error;
|
||||
|
||||
if (is_dir) {
|
||||
rdev = 0;
|
||||
|
@ -1389,12 +1388,6 @@ xfs_create(
|
|||
goto out_trans_abort;
|
||||
}
|
||||
|
||||
/*
|
||||
* At this point, we've gotten a newly allocated inode.
|
||||
* It is locked (and joined to the transaction).
|
||||
*/
|
||||
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
|
||||
|
||||
/*
|
||||
* Now we join the directory inode to the transaction. We do not do it
|
||||
* earlier because xfs_dir_ialloc might commit the previous transaction
|
||||
|
@ -1440,22 +1433,13 @@ xfs_create(
|
|||
*/
|
||||
xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp);
|
||||
|
||||
/*
|
||||
* xfs_trans_commit normally decrements the vnode ref count
|
||||
* when it unlocks the inode. Since we want to return the
|
||||
* vnode to the caller, we bump the vnode ref count now.
|
||||
*/
|
||||
IHOLD(ip);
|
||||
|
||||
error = xfs_bmap_finish(&tp, &free_list, &committed);
|
||||
if (error)
|
||||
goto out_abort_rele;
|
||||
goto out_bmap_cancel;
|
||||
|
||||
error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
|
||||
if (error) {
|
||||
IRELE(ip);
|
||||
goto out_dqrele;
|
||||
}
|
||||
if (error)
|
||||
goto out_release_inode;
|
||||
|
||||
xfs_qm_dqrele(udqp);
|
||||
xfs_qm_dqrele(gdqp);
|
||||
|
@ -1469,27 +1453,21 @@ xfs_create(
|
|||
cancel_flags |= XFS_TRANS_ABORT;
|
||||
out_trans_cancel:
|
||||
xfs_trans_cancel(tp, cancel_flags);
|
||||
out_dqrele:
|
||||
xfs_qm_dqrele(udqp);
|
||||
xfs_qm_dqrele(gdqp);
|
||||
|
||||
if (unlock_dp_on_error)
|
||||
xfs_iunlock(dp, XFS_ILOCK_EXCL);
|
||||
std_return:
|
||||
return error;
|
||||
|
||||
out_abort_rele:
|
||||
out_release_inode:
|
||||
/*
|
||||
* Wait until after the current transaction is aborted to
|
||||
* release the inode. This prevents recursive transactions
|
||||
* and deadlocks from xfs_inactive.
|
||||
*/
|
||||
xfs_bmap_cancel(&free_list);
|
||||
cancel_flags |= XFS_TRANS_ABORT;
|
||||
xfs_trans_cancel(tp, cancel_flags);
|
||||
IRELE(ip);
|
||||
unlock_dp_on_error = B_FALSE;
|
||||
goto out_dqrele;
|
||||
if (ip)
|
||||
IRELE(ip);
|
||||
|
||||
xfs_qm_dqrele(udqp);
|
||||
xfs_qm_dqrele(gdqp);
|
||||
|
||||
if (unlock_dp_on_error)
|
||||
xfs_iunlock(dp, XFS_ILOCK_EXCL);
|
||||
return error;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -2114,9 +2092,8 @@ xfs_symlink(
|
|||
XFS_BMAPI_WRITE | XFS_BMAPI_METADATA,
|
||||
&first_block, resblks, mval, &nmaps,
|
||||
&free_list);
|
||||
if (error) {
|
||||
goto error1;
|
||||
}
|
||||
if (error)
|
||||
goto error2;
|
||||
|
||||
if (resblks)
|
||||
resblks -= fs_blocks;
|
||||
|
@ -2148,7 +2125,7 @@ xfs_symlink(
|
|||
error = xfs_dir_createname(tp, dp, link_name, ip->i_ino,
|
||||
&first_block, &free_list, resblks);
|
||||
if (error)
|
||||
goto error1;
|
||||
goto error2;
|
||||
xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
|
||||
xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
|
||||
|
||||
|
@ -2161,13 +2138,6 @@ xfs_symlink(
|
|||
xfs_trans_set_sync(tp);
|
||||
}
|
||||
|
||||
/*
|
||||
* xfs_trans_commit normally decrements the vnode ref count
|
||||
* when it unlocks the inode. Since we want to return the
|
||||
* vnode to the caller, we bump the vnode ref count now.
|
||||
*/
|
||||
IHOLD(ip);
|
||||
|
||||
error = xfs_bmap_finish(&tp, &free_list, &committed);
|
||||
if (error) {
|
||||
goto error2;
|
||||
|
|
Loading…
Reference in New Issue