]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Nov 2011 16:54:15 +0000 (08:54 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Nov 2011 16:54:15 +0000 (08:54 -0800)
* 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/linux-nfs:
  NFS: Revert pnfs ugliness from the generic NFS read code path
  SUNRPC: destroy freshly allocated transport in case of sockaddr init error
  NFS: Fix a regression in the referral code
  nfs: move nfs_file_operations declaration to bottom of file.c (try #2)
  nfs: when attempting to open a directory, fall back on normal lookup (try #5)

1  2 
fs/nfs/pnfs.c

diff --combined fs/nfs/pnfs.c
index baf73536bc048e2085fabde5c2f523a6fbc3b523,e40a3ca22eaf5857be43de79cb216154995f1133..8e672a2b2d693193e8ca7252d70c73578d739e0f
@@@ -29,7 -29,6 +29,7 @@@
  
  #include <linux/nfs_fs.h>
  #include <linux/nfs_page.h>
 +#include <linux/module.h>
  #include "internal.h"
  #include "pnfs.h"
  #include "iostat.h"
@@@ -1260,6 -1259,25 +1260,25 @@@ pnfs_generic_pg_writepages(struct nfs_p
  }
  EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages);
  
+ static void pnfs_ld_handle_read_error(struct nfs_read_data *data)
+ {
+       struct nfs_pageio_descriptor pgio;
+       put_lseg(data->lseg);
+       data->lseg = NULL;
+       dprintk("pnfs write error = %d\n", data->pnfs_error);
+       nfs_pageio_init_read_mds(&pgio, data->inode);
+       while (!list_empty(&data->pages)) {
+               struct nfs_page *req = nfs_list_entry(data->pages.next);
+               nfs_list_remove_request(req);
+               nfs_pageio_add_request(&pgio, req);
+       }
+       nfs_pageio_complete(&pgio);
+ }
  /*
   * Called by non rpc-based layout drivers
   */
@@@ -1268,11 -1286,8 +1287,8 @@@ void pnfs_ld_read_done(struct nfs_read_
        if (likely(!data->pnfs_error)) {
                __nfs4_read_done_cb(data);
                data->mds_ops->rpc_call_done(&data->task, data);
-       } else {
-               put_lseg(data->lseg);
-               data->lseg = NULL;
-               dprintk("pnfs write error = %d\n", data->pnfs_error);
-       }
+       } else
+               pnfs_ld_handle_read_error(data);
        data->mds_ops->rpc_release(data);
  }
  EXPORT_SYMBOL_GPL(pnfs_ld_read_done);