upgrade to fedora-2.6.12-1.1398.FC4 + vserver 2.0.rc7
[linux-2.6.git] / fs / xfs / linux-2.6 / xfs_lrw.c
index bd80fb9..e3787ba 100644 (file)
@@ -317,7 +317,7 @@ xfs_read(
        xfs_rw_enter_trace(XFS_READ_ENTER, &ip->i_iocore,
                                (void *)iovp, segs, *offset, ioflags);
        ret = __generic_file_aio_read(iocb, iovp, segs, offset);
-       if (ret == -EIOCBQUEUED)
+       if (ret == -EIOCBQUEUED && !(ioflags & IO_ISAIO))
                ret = wait_on_sync_kiocb(iocb);
        if (ret > 0)
                XFS_STATS_ADD(xs_read_bytes, ret);
@@ -676,11 +676,16 @@ xfs_write(
        if (XFS_FORCED_SHUTDOWN(mp))
                return -EIO;
 
+       fs_check_frozen(vp->v_vfsp, SB_FREEZE_WRITE);
+
        if (ioflags & IO_ISDIRECT) {
                xfs_buftarg_t   *target =
                        (xip->i_d.di_flags & XFS_DIFLAG_REALTIME) ?
                                mp->m_rtdev_targp : mp->m_ddev_targp;
 
+               if (ioflags & IO_ISAIO)
+                       return XFS_ERROR(-ENOSYS);
+
                if ((pos & target->pbr_smask) || (count & target->pbr_smask))
                        return XFS_ERROR(-EINVAL);
 
@@ -854,7 +859,7 @@ retry:
 
        current->backing_dev_info = NULL;
 
-       if (ret == -EIOCBQUEUED)
+       if (ret == -EIOCBQUEUED && !(ioflags & IO_ISAIO))
                ret = wait_on_sync_kiocb(iocb);
 
        if ((ret == -ENOSPC) &&
@@ -869,6 +874,7 @@ retry:
                        goto out_unlock_isem;
                xfs_rwlock(bdp, locktype);
                pos = xip->i_d.di_size;
+               ret = 0;
                goto retry;
        }
 
@@ -960,9 +966,9 @@ retry:
                                xfs_trans_set_sync(tp);
                                error = xfs_trans_commit(tp, 0, NULL);
                                xfs_iunlock(xip, XFS_ILOCK_EXCL);
-                               if (error)
-                                       goto out_unlock_internal;
                        }
+                       if (error)
+                               goto out_unlock_internal;
                }
        
                xfs_rwunlock(bdp, locktype);