summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <jonas@perch.ndb.mysql.com>2006-02-08 14:27:25 +0100
committerunknown <jonas@perch.ndb.mysql.com>2006-02-08 14:27:25 +0100
commit0a614e7b3f7a648e8d4312228e76b099be37dff9 (patch)
treecd2d6f4619a88cdbd3d5dfe03d840774ef1d9770
parent5abf604db84fe8c177655034a1516258553693f2 (diff)
parent60ebb87e27140e7642ec9d4df58e87354afa3914 (diff)
downloadmariadb-git-0a614e7b3f7a648e8d4312228e76b099be37dff9.tar.gz
Merge mysqldev@production.mysql.com:/data0/mysqldev/my/mysql-5.1-release
into perch.ndb.mysql.com:/home/jonas/tmp/mysql-5.1-release
-rw-r--r--storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp b/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp
index 6947a4902a1..e0324c2c8ea 100644
--- a/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp
+++ b/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp
@@ -370,7 +370,6 @@ void AsyncFile::openReq(Request* request)
const int mode = S_IRUSR | S_IWUSR |
S_IRGRP | S_IWGRP |
S_IROTH | S_IWOTH;
-retry:
if(flags & FsOpenReq::OM_CREATE_IF_NONE){
if((theFd = ::open(theFileName.c_str(), new_flags, mode)) != -1) {
close(theFd);
@@ -432,6 +431,7 @@ retry:
m_fs.EXECUTE_DIRECT(block, GSN_FSWRITEREQ, signal,
FsReadWriteReq::FixedLength + 1);
+ retry:
Uint32 size = request->par.open.page_size;
char* buf = (char*)m_page_ptr.p;
while(size > 0){
@@ -449,9 +449,21 @@ retry:
}
if(size != 0)
{
+ int err = errno;
+#ifdef O_DIRECT
+ if ((new_flags & O_DIRECT) && off == 0)
+ {
+ ndbout_c("error on first write(%d), disable O_DIRECT", err);
+ new_flags &= ~O_DIRECT;
+ close(theFd);
+ theFd = ::open(theFileName.c_str(), new_flags, mode);
+ if (theFd != -1)
+ goto retry;
+ }
+#endif
close(theFd);
unlink(theFileName.c_str());
- request->error = errno;
+ request->error = err;
return;
}
off += request->par.open.page_size;