aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_log_recover.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r--fs/xfs/xfs_log_recover.c113
1 files changed, 68 insertions, 45 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index 1f0016b0b4ec..55b4237c2153 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. 2 * Copyright (c) 2000-2006 Silicon Graphics, Inc.
3 * All Rights Reserved. 3 * All Rights Reserved.
4 * 4 *
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
@@ -24,7 +24,6 @@
24#include "xfs_trans.h" 24#include "xfs_trans.h"
25#include "xfs_sb.h" 25#include "xfs_sb.h"
26#include "xfs_ag.h" 26#include "xfs_ag.h"
27#include "xfs_dir.h"
28#include "xfs_dir2.h" 27#include "xfs_dir2.h"
29#include "xfs_dmapi.h" 28#include "xfs_dmapi.h"
30#include "xfs_mount.h" 29#include "xfs_mount.h"
@@ -32,7 +31,6 @@
32#include "xfs_bmap_btree.h" 31#include "xfs_bmap_btree.h"
33#include "xfs_alloc_btree.h" 32#include "xfs_alloc_btree.h"
34#include "xfs_ialloc_btree.h" 33#include "xfs_ialloc_btree.h"
35#include "xfs_dir_sf.h"
36#include "xfs_dir2_sf.h" 34#include "xfs_dir2_sf.h"
37#include "xfs_attr_sf.h" 35#include "xfs_attr_sf.h"
38#include "xfs_dinode.h" 36#include "xfs_dinode.h"
@@ -193,14 +191,14 @@ xlog_header_check_dump(
193{ 191{
194 int b; 192 int b;
195 193
196 printk("%s: SB : uuid = ", __FUNCTION__); 194 cmn_err(CE_DEBUG, "%s: SB : uuid = ", __FUNCTION__);
197 for (b = 0; b < 16; b++) 195 for (b = 0; b < 16; b++)
198 printk("%02x",((unsigned char *)&mp->m_sb.sb_uuid)[b]); 196 cmn_err(CE_DEBUG, "%02x", ((uchar_t *)&mp->m_sb.sb_uuid)[b]);
199 printk(", fmt = %d\n", XLOG_FMT); 197 cmn_err(CE_DEBUG, ", fmt = %d\n", XLOG_FMT);
200 printk(" log : uuid = "); 198 cmn_err(CE_DEBUG, " log : uuid = ");
201 for (b = 0; b < 16; b++) 199 for (b = 0; b < 16; b++)
202 printk("%02x",((unsigned char *)&head->h_fs_uuid)[b]); 200 cmn_err(CE_DEBUG, "%02x",((uchar_t *)&head->h_fs_uuid)[b]);
203 printk(", fmt = %d\n", INT_GET(head->h_fmt, ARCH_CONVERT)); 201 cmn_err(CE_DEBUG, ", fmt = %d\n", INT_GET(head->h_fmt, ARCH_CONVERT));
204} 202}
205#else 203#else
206#define xlog_header_check_dump(mp, head) 204#define xlog_header_check_dump(mp, head)
@@ -282,7 +280,7 @@ xlog_recover_iodone(
282 mp = XFS_BUF_FSPRIVATE(bp, xfs_mount_t *); 280 mp = XFS_BUF_FSPRIVATE(bp, xfs_mount_t *);
283 xfs_ioerror_alert("xlog_recover_iodone", 281 xfs_ioerror_alert("xlog_recover_iodone",
284 mp, bp, XFS_BUF_ADDR(bp)); 282 mp, bp, XFS_BUF_ADDR(bp));
285 xfs_force_shutdown(mp, XFS_METADATA_IO_ERROR); 283 xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR);
286 } 284 }
287 XFS_BUF_SET_FSPRIVATE(bp, NULL); 285 XFS_BUF_SET_FSPRIVATE(bp, NULL);
288 XFS_BUF_CLR_IODONE_FUNC(bp); 286 XFS_BUF_CLR_IODONE_FUNC(bp);
@@ -1889,7 +1887,7 @@ xlog_recover_do_inode_buffer(
1889 1887
1890 buffer_nextp = (xfs_agino_t *)xfs_buf_offset(bp, 1888 buffer_nextp = (xfs_agino_t *)xfs_buf_offset(bp,
1891 next_unlinked_offset); 1889 next_unlinked_offset);
1892 INT_SET(*buffer_nextp, ARCH_CONVERT, *logged_nextp); 1890 *buffer_nextp = *logged_nextp;
1893 } 1891 }
1894 1892
1895 return 0; 1893 return 0;
@@ -2292,12 +2290,22 @@ xlog_recover_do_inode_trans(
2292 int attr_index; 2290 int attr_index;
2293 uint fields; 2291 uint fields;
2294 xfs_dinode_core_t *dicp; 2292 xfs_dinode_core_t *dicp;
2293 int need_free = 0;
2295 2294
2296 if (pass == XLOG_RECOVER_PASS1) { 2295 if (pass == XLOG_RECOVER_PASS1) {
2297 return 0; 2296 return 0;
2298 } 2297 }
2299 2298
2300 in_f = (xfs_inode_log_format_t *)item->ri_buf[0].i_addr; 2299 if (item->ri_buf[0].i_len == sizeof(xfs_inode_log_format_t)) {
2300 in_f = (xfs_inode_log_format_t *)item->ri_buf[0].i_addr;
2301 } else {
2302 in_f = (xfs_inode_log_format_t *)kmem_alloc(
2303 sizeof(xfs_inode_log_format_t), KM_SLEEP);
2304 need_free = 1;
2305 error = xfs_inode_item_format_convert(&item->ri_buf[0], in_f);
2306 if (error)
2307 goto error;
2308 }
2301 ino = in_f->ilf_ino; 2309 ino = in_f->ilf_ino;
2302 mp = log->l_mp; 2310 mp = log->l_mp;
2303 if (ITEM_TYPE(item) == XFS_LI_INODE) { 2311 if (ITEM_TYPE(item) == XFS_LI_INODE) {
@@ -2323,8 +2331,10 @@ xlog_recover_do_inode_trans(
2323 * Inode buffers can be freed, look out for it, 2331 * Inode buffers can be freed, look out for it,
2324 * and do not replay the inode. 2332 * and do not replay the inode.
2325 */ 2333 */
2326 if (xlog_check_buffer_cancelled(log, imap.im_blkno, imap.im_len, 0)) 2334 if (xlog_check_buffer_cancelled(log, imap.im_blkno, imap.im_len, 0)) {
2327 return 0; 2335 error = 0;
2336 goto error;
2337 }
2328 2338
2329 bp = xfs_buf_read_flags(mp->m_ddev_targp, imap.im_blkno, imap.im_len, 2339 bp = xfs_buf_read_flags(mp->m_ddev_targp, imap.im_blkno, imap.im_len,
2330 XFS_BUF_LOCK); 2340 XFS_BUF_LOCK);
@@ -2333,7 +2343,7 @@ xlog_recover_do_inode_trans(
2333 bp, imap.im_blkno); 2343 bp, imap.im_blkno);
2334 error = XFS_BUF_GETERROR(bp); 2344 error = XFS_BUF_GETERROR(bp);
2335 xfs_buf_relse(bp); 2345 xfs_buf_relse(bp);
2336 return error; 2346 goto error;
2337 } 2347 }
2338 error = 0; 2348 error = 0;
2339 ASSERT(in_f->ilf_fields & XFS_ILOG_CORE); 2349 ASSERT(in_f->ilf_fields & XFS_ILOG_CORE);
@@ -2350,7 +2360,8 @@ xlog_recover_do_inode_trans(
2350 dip, bp, ino); 2360 dip, bp, ino);
2351 XFS_ERROR_REPORT("xlog_recover_do_inode_trans(1)", 2361 XFS_ERROR_REPORT("xlog_recover_do_inode_trans(1)",
2352 XFS_ERRLEVEL_LOW, mp); 2362 XFS_ERRLEVEL_LOW, mp);
2353 return XFS_ERROR(EFSCORRUPTED); 2363 error = EFSCORRUPTED;
2364 goto error;
2354 } 2365 }
2355 dicp = (xfs_dinode_core_t*)(item->ri_buf[1].i_addr); 2366 dicp = (xfs_dinode_core_t*)(item->ri_buf[1].i_addr);
2356 if (unlikely(dicp->di_magic != XFS_DINODE_MAGIC)) { 2367 if (unlikely(dicp->di_magic != XFS_DINODE_MAGIC)) {
@@ -2360,7 +2371,8 @@ xlog_recover_do_inode_trans(
2360 item, ino); 2371 item, ino);
2361 XFS_ERROR_REPORT("xlog_recover_do_inode_trans(2)", 2372 XFS_ERROR_REPORT("xlog_recover_do_inode_trans(2)",
2362 XFS_ERRLEVEL_LOW, mp); 2373 XFS_ERRLEVEL_LOW, mp);
2363 return XFS_ERROR(EFSCORRUPTED); 2374 error = EFSCORRUPTED;
2375 goto error;
2364 } 2376 }
2365 2377
2366 /* Skip replay when the on disk inode is newer than the log one */ 2378 /* Skip replay when the on disk inode is newer than the log one */
@@ -2376,7 +2388,8 @@ xlog_recover_do_inode_trans(
2376 /* do nothing */ 2388 /* do nothing */
2377 } else { 2389 } else {
2378 xfs_buf_relse(bp); 2390 xfs_buf_relse(bp);
2379 return 0; 2391 error = 0;
2392 goto error;
2380 } 2393 }
2381 } 2394 }
2382 /* Take the opportunity to reset the flush iteration count */ 2395 /* Take the opportunity to reset the flush iteration count */
@@ -2391,7 +2404,8 @@ xlog_recover_do_inode_trans(
2391 xfs_fs_cmn_err(CE_ALERT, mp, 2404 xfs_fs_cmn_err(CE_ALERT, mp,
2392 "xfs_inode_recover: Bad regular inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld", 2405 "xfs_inode_recover: Bad regular inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
2393 item, dip, bp, ino); 2406 item, dip, bp, ino);
2394 return XFS_ERROR(EFSCORRUPTED); 2407 error = EFSCORRUPTED;
2408 goto error;
2395 } 2409 }
2396 } else if (unlikely((dicp->di_mode & S_IFMT) == S_IFDIR)) { 2410 } else if (unlikely((dicp->di_mode & S_IFMT) == S_IFDIR)) {
2397 if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) && 2411 if ((dicp->di_format != XFS_DINODE_FMT_EXTENTS) &&
@@ -2403,7 +2417,8 @@ xlog_recover_do_inode_trans(
2403 xfs_fs_cmn_err(CE_ALERT, mp, 2417 xfs_fs_cmn_err(CE_ALERT, mp,
2404 "xfs_inode_recover: Bad dir inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld", 2418 "xfs_inode_recover: Bad dir inode log record, rec ptr 0x%p, ino ptr = 0x%p, ino bp = 0x%p, ino %Ld",
2405 item, dip, bp, ino); 2419 item, dip, bp, ino);
2406 return XFS_ERROR(EFSCORRUPTED); 2420 error = EFSCORRUPTED;
2421 goto error;
2407 } 2422 }
2408 } 2423 }
2409 if (unlikely(dicp->di_nextents + dicp->di_anextents > dicp->di_nblocks)){ 2424 if (unlikely(dicp->di_nextents + dicp->di_anextents > dicp->di_nblocks)){
@@ -2415,7 +2430,8 @@ xlog_recover_do_inode_trans(
2415 item, dip, bp, ino, 2430 item, dip, bp, ino,
2416 dicp->di_nextents + dicp->di_anextents, 2431 dicp->di_nextents + dicp->di_anextents,
2417 dicp->di_nblocks); 2432 dicp->di_nblocks);
2418 return XFS_ERROR(EFSCORRUPTED); 2433 error = EFSCORRUPTED;
2434 goto error;
2419 } 2435 }
2420 if (unlikely(dicp->di_forkoff > mp->m_sb.sb_inodesize)) { 2436 if (unlikely(dicp->di_forkoff > mp->m_sb.sb_inodesize)) {
2421 XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(6)", 2437 XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(6)",
@@ -2424,7 +2440,8 @@ xlog_recover_do_inode_trans(
2424 xfs_fs_cmn_err(CE_ALERT, mp, 2440 xfs_fs_cmn_err(CE_ALERT, mp,
2425 "xfs_inode_recover: Bad inode log rec ptr 0x%p, dino ptr 0x%p, dino bp 0x%p, ino %Ld, forkoff 0x%x", 2441 "xfs_inode_recover: Bad inode log rec ptr 0x%p, dino ptr 0x%p, dino bp 0x%p, ino %Ld, forkoff 0x%x",
2426 item, dip, bp, ino, dicp->di_forkoff); 2442 item, dip, bp, ino, dicp->di_forkoff);
2427 return XFS_ERROR(EFSCORRUPTED); 2443 error = EFSCORRUPTED;
2444 goto error;
2428 } 2445 }
2429 if (unlikely(item->ri_buf[1].i_len > sizeof(xfs_dinode_core_t))) { 2446 if (unlikely(item->ri_buf[1].i_len > sizeof(xfs_dinode_core_t))) {
2430 XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(7)", 2447 XFS_CORRUPTION_ERROR("xlog_recover_do_inode_trans(7)",
@@ -2433,7 +2450,8 @@ xlog_recover_do_inode_trans(
2433 xfs_fs_cmn_err(CE_ALERT, mp, 2450 xfs_fs_cmn_err(CE_ALERT, mp,
2434 "xfs_inode_recover: Bad inode log record length %d, rec ptr 0x%p", 2451 "xfs_inode_recover: Bad inode log record length %d, rec ptr 0x%p",
2435 item->ri_buf[1].i_len, item); 2452 item->ri_buf[1].i_len, item);
2436 return XFS_ERROR(EFSCORRUPTED); 2453 error = EFSCORRUPTED;
2454 goto error;
2437 } 2455 }
2438 2456
2439 /* The core is in in-core format */ 2457 /* The core is in in-core format */
@@ -2521,7 +2539,8 @@ xlog_recover_do_inode_trans(
2521 xlog_warn("XFS: xlog_recover_do_inode_trans: Invalid flag"); 2539 xlog_warn("XFS: xlog_recover_do_inode_trans: Invalid flag");
2522 ASSERT(0); 2540 ASSERT(0);
2523 xfs_buf_relse(bp); 2541 xfs_buf_relse(bp);
2524 return XFS_ERROR(EIO); 2542 error = EIO;
2543 goto error;
2525 } 2544 }
2526 } 2545 }
2527 2546
@@ -2537,7 +2556,10 @@ write_inode_buffer:
2537 error = xfs_bwrite(mp, bp); 2556 error = xfs_bwrite(mp, bp);
2538 } 2557 }
2539 2558
2540 return (error); 2559error:
2560 if (need_free)
2561 kmem_free(in_f, sizeof(*in_f));
2562 return XFS_ERROR(error);
2541} 2563}
2542 2564
2543/* 2565/*
@@ -2674,32 +2696,32 @@ xlog_recover_do_dquot_trans(
2674 * structure into it, and adds the efi to the AIL with the given 2696 * structure into it, and adds the efi to the AIL with the given
2675 * LSN. 2697 * LSN.
2676 */ 2698 */
2677STATIC void 2699STATIC int
2678xlog_recover_do_efi_trans( 2700xlog_recover_do_efi_trans(
2679 xlog_t *log, 2701 xlog_t *log,
2680 xlog_recover_item_t *item, 2702 xlog_recover_item_t *item,
2681 xfs_lsn_t lsn, 2703 xfs_lsn_t lsn,
2682 int pass) 2704 int pass)
2683{ 2705{
2706 int error;
2684 xfs_mount_t *mp; 2707 xfs_mount_t *mp;
2685 xfs_efi_log_item_t *efip; 2708 xfs_efi_log_item_t *efip;
2686 xfs_efi_log_format_t *efi_formatp; 2709 xfs_efi_log_format_t *efi_formatp;
2687 SPLDECL(s); 2710 SPLDECL(s);
2688 2711
2689 if (pass == XLOG_RECOVER_PASS1) { 2712 if (pass == XLOG_RECOVER_PASS1) {
2690 return; 2713 return 0;
2691 } 2714 }
2692 2715
2693 efi_formatp = (xfs_efi_log_format_t *)item->ri_buf[0].i_addr; 2716 efi_formatp = (xfs_efi_log_format_t *)item->ri_buf[0].i_addr;
2694 ASSERT(item->ri_buf[0].i_len ==
2695 (sizeof(xfs_efi_log_format_t) +
2696 ((efi_formatp->efi_nextents - 1) * sizeof(xfs_extent_t))));
2697 2717
2698 mp = log->l_mp; 2718 mp = log->l_mp;
2699 efip = xfs_efi_init(mp, efi_formatp->efi_nextents); 2719 efip = xfs_efi_init(mp, efi_formatp->efi_nextents);
2700 memcpy((char *)&(efip->efi_format), (char *)efi_formatp, 2720 if ((error = xfs_efi_copy_format(&(item->ri_buf[0]),
2701 sizeof(xfs_efi_log_format_t) + 2721 &(efip->efi_format)))) {
2702 ((efi_formatp->efi_nextents - 1) * sizeof(xfs_extent_t))); 2722 xfs_efi_item_free(efip);
2723 return error;
2724 }
2703 efip->efi_next_extent = efi_formatp->efi_nextents; 2725 efip->efi_next_extent = efi_formatp->efi_nextents;
2704 efip->efi_flags |= XFS_EFI_COMMITTED; 2726 efip->efi_flags |= XFS_EFI_COMMITTED;
2705 2727
@@ -2708,6 +2730,7 @@ xlog_recover_do_efi_trans(
2708 * xfs_trans_update_ail() drops the AIL lock. 2730 * xfs_trans_update_ail() drops the AIL lock.
2709 */ 2731 */
2710 xfs_trans_update_ail(mp, (xfs_log_item_t *)efip, lsn, s); 2732 xfs_trans_update_ail(mp, (xfs_log_item_t *)efip, lsn, s);
2733 return 0;
2711} 2734}
2712 2735
2713 2736
@@ -2738,9 +2761,10 @@ xlog_recover_do_efd_trans(
2738 } 2761 }
2739 2762
2740 efd_formatp = (xfs_efd_log_format_t *)item->ri_buf[0].i_addr; 2763 efd_formatp = (xfs_efd_log_format_t *)item->ri_buf[0].i_addr;
2741 ASSERT(item->ri_buf[0].i_len == 2764 ASSERT((item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_32_t) +
2742 (sizeof(xfs_efd_log_format_t) + 2765 ((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_32_t)))) ||
2743 ((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_t)))); 2766 (item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_64_t) +
2767 ((efd_formatp->efd_nextents - 1) * sizeof(xfs_extent_64_t)))));
2744 efi_id = efd_formatp->efd_efi_id; 2768 efi_id = efd_formatp->efd_efi_id;
2745 2769
2746 /* 2770 /*
@@ -2810,15 +2834,14 @@ xlog_recover_do_trans(
2810 if ((error = xlog_recover_do_buffer_trans(log, item, 2834 if ((error = xlog_recover_do_buffer_trans(log, item,
2811 pass))) 2835 pass)))
2812 break; 2836 break;
2813 } else if ((ITEM_TYPE(item) == XFS_LI_INODE) || 2837 } else if ((ITEM_TYPE(item) == XFS_LI_INODE)) {
2814 (ITEM_TYPE(item) == XFS_LI_6_1_INODE) ||
2815 (ITEM_TYPE(item) == XFS_LI_5_3_INODE)) {
2816 if ((error = xlog_recover_do_inode_trans(log, item, 2838 if ((error = xlog_recover_do_inode_trans(log, item,
2817 pass))) 2839 pass)))
2818 break; 2840 break;
2819 } else if (ITEM_TYPE(item) == XFS_LI_EFI) { 2841 } else if (ITEM_TYPE(item) == XFS_LI_EFI) {
2820 xlog_recover_do_efi_trans(log, item, trans->r_lsn, 2842 if ((error = xlog_recover_do_efi_trans(log, item, trans->r_lsn,
2821 pass); 2843 pass)))
2844 break;
2822 } else if (ITEM_TYPE(item) == XFS_LI_EFD) { 2845 } else if (ITEM_TYPE(item) == XFS_LI_EFD) {
2823 xlog_recover_do_efd_trans(log, item, pass); 2846 xlog_recover_do_efd_trans(log, item, pass);
2824 } else if (ITEM_TYPE(item) == XFS_LI_DQUOT) { 2847 } else if (ITEM_TYPE(item) == XFS_LI_DQUOT) {
@@ -3419,13 +3442,13 @@ xlog_unpack_data_checksum(
3419 if (rhead->h_chksum || 3442 if (rhead->h_chksum ||
3420 ((log->l_flags & XLOG_CHKSUM_MISMATCH) == 0)) { 3443 ((log->l_flags & XLOG_CHKSUM_MISMATCH) == 0)) {
3421 cmn_err(CE_DEBUG, 3444 cmn_err(CE_DEBUG,
3422 "XFS: LogR chksum mismatch: was (0x%x) is (0x%x)", 3445 "XFS: LogR chksum mismatch: was (0x%x) is (0x%x)\n",
3423 INT_GET(rhead->h_chksum, ARCH_CONVERT), chksum); 3446 INT_GET(rhead->h_chksum, ARCH_CONVERT), chksum);
3424 cmn_err(CE_DEBUG, 3447 cmn_err(CE_DEBUG,
3425"XFS: Disregard message if filesystem was created with non-DEBUG kernel"); 3448"XFS: Disregard message if filesystem was created with non-DEBUG kernel");
3426 if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) { 3449 if (XFS_SB_VERSION_HASLOGV2(&log->l_mp->m_sb)) {
3427 cmn_err(CE_DEBUG, 3450 cmn_err(CE_DEBUG,
3428 "XFS: LogR this is a LogV2 filesystem"); 3451 "XFS: LogR this is a LogV2 filesystem\n");
3429 } 3452 }
3430 log->l_flags |= XLOG_CHKSUM_MISMATCH; 3453 log->l_flags |= XLOG_CHKSUM_MISMATCH;
3431 } 3454 }
@@ -3798,7 +3821,7 @@ xlog_do_log_recovery(
3798 error = xlog_do_recovery_pass(log, head_blk, tail_blk, 3821 error = xlog_do_recovery_pass(log, head_blk, tail_blk,
3799 XLOG_RECOVER_PASS2); 3822 XLOG_RECOVER_PASS2);
3800#ifdef DEBUG 3823#ifdef DEBUG
3801 { 3824 if (!error) {
3802 int i; 3825 int i;
3803 3826
3804 for (i = 0; i < XLOG_BC_TABLE_SIZE; i++) 3827 for (i = 0; i < XLOG_BC_TABLE_SIZE; i++)
@@ -3974,7 +3997,7 @@ xlog_recover_finish(
3974 log->l_flags &= ~XLOG_RECOVERY_NEEDED; 3997 log->l_flags &= ~XLOG_RECOVERY_NEEDED;
3975 } else { 3998 } else {
3976 cmn_err(CE_DEBUG, 3999 cmn_err(CE_DEBUG,
3977 "!Ending clean XFS mount for filesystem: %s", 4000 "!Ending clean XFS mount for filesystem: %s\n",
3978 log->l_mp->m_fsname); 4001 log->l_mp->m_fsname);
3979 } 4002 }
3980 return 0; 4003 return 0;