ceph: use LOOKUPINO to make unconnected nfs fh more reliable
authorSage Weil <sage@newdream.net>
Wed, 6 Apr 2011 16:31:40 +0000 (09:31 -0700)
committerSage Weil <sage@newdream.net>
Tue, 24 May 2011 18:52:05 +0000 (11:52 -0700)
If we are unable to locate an inode by ino, ask the MDS using the new
LOOKUPINO command.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/export.c
include/linux/ceph/ceph_fs.h

index e41056174bf81ad96397500ad89b19754a9bc0ff..f1828af09912b610005752f3f44cb2ae32276d90 100644 (file)
@@ -86,6 +86,7 @@ static int ceph_encode_fh(struct dentry *dentry, u32 *rawfh, int *max_len,
 static struct dentry *__fh_to_dentry(struct super_block *sb,
                                     struct ceph_nfs_fh *fh)
 {
+       struct ceph_mds_client *mdsc = ceph_sb_to_client(sb)->mdsc;
        struct inode *inode;
        struct dentry *dentry;
        struct ceph_vino vino;
@@ -95,8 +96,22 @@ static struct dentry *__fh_to_dentry(struct super_block *sb,
        vino.ino = fh->ino;
        vino.snap = CEPH_NOSNAP;
        inode = ceph_find_inode(sb, vino);
-       if (!inode)
-               return ERR_PTR(-ESTALE);
+       if (!inode) {
+               struct ceph_mds_request *req;
+
+               req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_LOOKUPINO,
+                                              USE_ANY_MDS);
+               if (IS_ERR(req))
+                       return ERR_CAST(req);
+
+               req->r_ino1 = vino;
+               req->r_num_caps = 1;
+               err = ceph_mdsc_do_request(mdsc, NULL, req);
+               ceph_mdsc_put_request(req);
+               inode = ceph_find_inode(sb, vino);
+               if (!inode)
+                       return ERR_PTR(-ESTALE);
+       }
 
        dentry = d_obtain_alias(inode);
        if (IS_ERR(dentry)) {
index b8e995fbd8670a2c7303d590432dc2a5e1f62b0d..b8c60694b2b0977d4ecdb982d8bcaea5f0ef2673 100644 (file)
@@ -313,6 +313,7 @@ enum {
        CEPH_MDS_OP_GETATTR    = 0x00101,
        CEPH_MDS_OP_LOOKUPHASH = 0x00102,
        CEPH_MDS_OP_LOOKUPPARENT = 0x00103,
+       CEPH_MDS_OP_LOOKUPINO  = 0x00104,
 
        CEPH_MDS_OP_SETXATTR   = 0x01105,
        CEPH_MDS_OP_RMXATTR    = 0x01106,