]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/xfs/xfs_log.c
Merge branch 'linux-2.6'
[mv-sheeva.git] / fs / xfs / xfs_log.c
index 635f99e6302ff642f940bd0d448cf6a06760c6f3..9bfb69e1e885d2fcf7891392c664b4110e4c9161 100644 (file)
@@ -817,10 +817,8 @@ xfs_log_need_covered(xfs_mount_t *mp)
        SPLDECL(s);
        int             needed = 0, gen;
        xlog_t          *log = mp->m_log;
-       bhv_vfs_t       *vfsp = XFS_MTOVFS(mp);
 
-       if (vfs_test_for_freeze(vfsp) || XFS_FORCED_SHUTDOWN(mp) ||
-           (vfsp->vfs_flag & VFS_RDONLY))
+       if (!xfs_fs_writable(mp))
                return 0;
 
        s = LOG_LOCK(log);
@@ -967,14 +965,16 @@ xlog_iodone(xfs_buf_t *bp)
        } else if (iclog->ic_state & XLOG_STATE_IOERROR) {
                aborted = XFS_LI_ABORTED;
        }
+
+       /* log I/O is always issued ASYNC */
+       ASSERT(XFS_BUF_ISASYNC(bp));
        xlog_state_done_syncing(iclog, aborted);
-       if (!(XFS_BUF_ISASYNC(bp))) {
-               /*
-                * Corresponding psema() will be done in bwrite().  If we don't
-                * vsema() here, panic.
-                */
-               XFS_BUF_V_IODONESEMA(bp);
-       }
+       /*
+        * do not reference the buffer (bp) here as we could race
+        * with it being freed after writing the unmount record to the
+        * log.
+        */
+
 }      /* xlog_iodone */
 
 /*
@@ -1434,7 +1434,7 @@ xlog_sync(xlog_t          *log,
        } else {
                iclog->ic_bwritecnt = 1;
        }
-       XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count);
+       XFS_BUF_SET_COUNT(bp, count);
        XFS_BUF_SET_FSPRIVATE(bp, iclog);       /* save for later */
        XFS_BUF_ZEROFLAGS(bp);
        XFS_BUF_BUSY(bp);
@@ -2185,13 +2185,13 @@ xlog_state_do_callback(
                        }
                        cb = iclog->ic_callback;
 
-                       while (cb != 0) {
+                       while (cb) {
                                iclog->ic_callback_tail = &(iclog->ic_callback);
                                iclog->ic_callback = NULL;
                                LOG_UNLOCK(log, s);
 
                                /* perform callbacks in the order given */
-                               for (; cb != 0; cb = cb_next) {
+                               for (; cb; cb = cb_next) {
                                        cb_next = cb->cb_next;
                                        cb->cb_func(cb->cb_arg, aborted);
                                }
@@ -2202,7 +2202,7 @@ xlog_state_do_callback(
                        loopdidcallbacks++;
                        funcdidcallbacks++;
 
-                       ASSERT(iclog->ic_callback == 0);
+                       ASSERT(iclog->ic_callback == NULL);
                        if (!(iclog->ic_state & XLOG_STATE_IOERROR))
                                iclog->ic_state = XLOG_STATE_DIRTY;
 
@@ -3242,10 +3242,10 @@ xlog_ticket_put(xlog_t          *log,
 #else
        /* When we debug, it is easier if tickets are cycled */
        ticket->t_next     = NULL;
-       if (log->l_tail != 0) {
+       if (log->l_tail) {
                log->l_tail->t_next = ticket;
        } else {
-               ASSERT(log->l_freelist == 0);
+               ASSERT(log->l_freelist == NULL);
                log->l_freelist = ticket;
        }
        log->l_tail         = ticket;
@@ -3463,7 +3463,7 @@ xlog_verify_iclog(xlog_t   *log,
        s = LOG_LOCK(log);
        icptr = log->l_iclog;
        for (i=0; i < log->l_iclog_bufs; i++) {
-               if (icptr == 0)
+               if (icptr == NULL)
                        xlog_panic("xlog_verify_iclog: invalid ptr");
                icptr = icptr->ic_next;
        }