Index: src/java/org/apache/hadoop/hdfs/DistributedFileSystem.java
===================================================================
--- src/java/org/apache/hadoop/hdfs/DistributedFileSystem.java	(revision 811726)
+++ src/java/org/apache/hadoop/hdfs/DistributedFileSystem.java	(working copy)
@@ -177,7 +177,14 @@
     }
     return dfs.getBlockLocations(getPathName(file.getPath()), start, len);
   }
+  
+  @Override
+  public BlockLocation[] getFileBlockLocations(Path p, 
+      long start, long len) throws IOException {
+    return dfs.getBlockLocations(getPathName(p), start, len);
 
+  }
+
   @Override
   public void setVerifyChecksum(boolean verifyChecksum) {
     this.verifyChecksum = verifyChecksum;
@@ -208,6 +215,17 @@
                    flag, replication, blockSize, progress, bufferSize),
         statistics);
   }
+  
+  @Override
+  protected FSDataOutputStream createAbsPerm(Path f,
+      FsPermission absolutePermission, EnumSet<CreateFlag> flag, int bufferSize,
+      short replication, long blockSize, Progressable progress, int bytesPerChecksum) throws IOException {
+    return new FSDataOutputStream
+    (dfs.createAbs(getPathName(f), absolutePermission,
+                flag, replication, blockSize, progress, bufferSize, bytesPerChecksum),
+     statistics);
+   }
+  
 
   @Override
   public boolean setReplication(Path src, 
@@ -272,7 +290,18 @@
   public boolean mkdirs(Path f, FsPermission permission) throws IOException {
     return dfs.mkdirs(getPathName(f), permission);
   }
+  
 
+
+  @Override
+  protected boolean mkdirsAbsPerm(Path f, FsPermission absolutePermission
+      ) throws IOException {
+    return dfs.mkdirsAbs(getPathName(f), absolutePermission);
+    
+  }
+
+
+
   /** {@inheritDoc} */
   @Override
   public void close() throws IOException {
@@ -524,6 +553,4 @@
       ) throws IOException {
     dfs.setTimes(getPathName(p), mtime, atime);
   }
-  
-  
 }
Index: src/java/org/apache/hadoop/hdfs/DFSClient.java
===================================================================
--- src/java/org/apache/hadoop/hdfs/DFSClient.java	(revision 811726)
+++ src/java/org/apache/hadoop/hdfs/DFSClient.java	(working copy)
@@ -531,10 +531,33 @@
       permission = FsPermission.getDefault();
     }
     FsPermission masked = permission.applyUMask(FsPermission.getUMask(conf));
-    LOG.debug(src + ": masked=" + masked);
-    OutputStream result = new DFSOutputStream(src, masked,
+    return createAbs(src, masked, flag, replication,
+         blockSize, progress, buffersize, conf.getInt("io.bytes.per.checksum", 512));
+  }
+  
+  /**
+   * Same as {{@link #create(String, FsPermission, EnumSet, short, long,
+   *  Progressable, int)}   except that the permission
+   *   is absolute (ie has already been masked with umask.
+   * 
+   */
+  public OutputStream createAbs(String src, 
+                             FsPermission absPermission,
+                             EnumSet<CreateFlag> flag, 
+                             short replication,
+                             long blockSize,
+                             Progressable progress,
+                             int buffersize,
+                             int bytesPerChecksum
+                             ) throws IOException {
+    checkOpen();
+    if (absPermission == null) {
+      absPermission = FsPermission.getDefault().applyUMask(FsPermission.getUMask(conf));
+    } 
+    LOG.debug(src + ": masked=" + absPermission);
+    OutputStream result = new DFSOutputStream(src, absPermission,
         flag, replication, blockSize, progress, buffersize,
-        conf.getInt("io.bytes.per.checksum", 512));
+        bytesPerChecksum);
     leasechecker.put(src, result);
     return result;
   }
@@ -953,9 +976,23 @@
       permission = FsPermission.getDefault();
     }
     FsPermission masked = permission.applyUMask(FsPermission.getUMask(conf));
-    LOG.debug(src + ": masked=" + masked);
+    return mkdirsAbs(src, masked);
+  }
+  
+  
+  /**
+   * Same {{@link #mkdirs(String, FsPermission)} except that thr permissions
+   * has already been masked against umask
+   */
+  public boolean mkdirsAbs(String src, FsPermission absPermission)throws IOException{
+    checkOpen();
+    if (absPermission == null) {
+      absPermission = FsPermission.getDefault().applyUMask(FsPermission.getUMask(conf));
+    } 
+
+    LOG.debug(src + ": masked=" + absPermission);
     try {
-      return namenode.mkdirs(src, masked);
+      return namenode.mkdirs(src, absPermission);
     } catch(RemoteException re) {
       throw re.unwrapRemoteException(AccessControlException.class,
                                      NSQuotaExceededException.class,
