Whamcloud - gitweb
MDS wasn't handling refcount on vfsmount's correctly,
authorbraam <braam>
Fri, 22 Feb 2002 23:35:51 +0000 (23:35 +0000)
committerbraam <braam>
Fri, 22 Feb 2002 23:35:51 +0000 (23:35 +0000)
 resulting in oops.

lustre/mds/handler.c
lustre/mds/mds_reint.c
lustre/tests/llmount.sh

index a6ad4f6..c9cb6c6 100644 (file)
@@ -209,6 +209,8 @@ struct dentry *mds_fid2dentry(struct mds_obd *mds, struct ll_fid *fid,
        /* now to find a dentry.
         * If possible, get a well-connected one
         */
+       if (mnt)
+               *mnt = mds->mds_vfsmnt;
        spin_lock(&dcache_lock);
        for (lp = inode->i_dentry.next; lp != &inode->i_dentry ; lp=lp->next) {
                result = list_entry(lp,struct dentry, d_alias);
@@ -217,6 +219,8 @@ struct dentry *mds_fid2dentry(struct mds_obd *mds, struct ll_fid *fid,
                        result->d_vfs_flags |= DCACHE_REFERENCED;
                        spin_unlock(&dcache_lock);
                        iput(inode);
+                       if (mnt)
+                               mntget(*mnt);
                        return result;
                }
        }
@@ -226,6 +230,8 @@ struct dentry *mds_fid2dentry(struct mds_obd *mds, struct ll_fid *fid,
                iput(inode);
                return ERR_PTR(-ENOMEM);
        }
+       if (mnt)
+               mntget(*mnt);
        result->d_flags |= DCACHE_NFSD_DISCONNECTED;
        return result;
 }
index e2c7404..bb94080 100644 (file)
@@ -35,10 +35,9 @@ extern struct ptlrpc_request *mds_prep_req(int size, int opcode, int namelen, ch
 
 static int mds_reint_setattr(struct mds_update_record *rec, struct ptlrpc_request *req)
 {
-       struct vfsmount *mnt;
        struct dentry *de;
 
-       de = mds_fid2dentry(req->rq_obd, rec->ur_fid1, &mnt);
+       de = mds_fid2dentry(req->rq_obd, rec->ur_fid1, NULL);
        if (IS_ERR(de)) { 
                req->rq_rephdr->status = -ESTALE;
                return 0;
@@ -87,7 +86,6 @@ static inline void mds_store_objid(struct inode *inode, __u64 *id)
 static int mds_reint_create(struct mds_update_record *rec, 
                            struct ptlrpc_request *req)
 {
-       struct vfsmount *mnt;
        int type = rec->ur_mode & S_IFMT;
        struct dentry *de;
        struct mds_rep *rep = req->rq_rep.mds;
@@ -95,7 +93,7 @@ static int mds_reint_create(struct mds_update_record *rec,
        int rc;
        ENTRY;
 
-       de = mds_fid2dentry(req->rq_obd, rec->ur_fid1, &mnt);
+       de = mds_fid2dentry(req->rq_obd, rec->ur_fid1, NULL);
        if (IS_ERR(de)) { 
                req->rq_rephdr->status = -ESTALE;
                EXIT;
@@ -171,13 +169,12 @@ static int mds_reint_create(struct mds_update_record *rec,
 static int mds_reint_unlink(struct mds_update_record *rec, 
                            struct ptlrpc_request *req)
 {
-       struct vfsmount *mnt;
        struct dentry *de;
        struct dentry *dchild; 
        int rc;
        ENTRY;
 
-       de = mds_fid2dentry(req->rq_obd, rec->ur_fid1, &mnt);
+       de = mds_fid2dentry(req->rq_obd, rec->ur_fid1, NULL);
        if (IS_ERR(de)) { 
                req->rq_rephdr->status = -ESTALE;
                EXIT;
@@ -226,7 +223,6 @@ static int mds_reint_unlink(struct mds_update_record *rec,
 static int mds_reint_link(struct mds_update_record *rec, 
                            struct ptlrpc_request *req)
 {
-       struct vfsmount *mnt;
        struct dentry *de_src = NULL;
        struct dentry *de_tgt_dir = NULL;
        struct dentry *dchild = NULL; 
@@ -234,13 +230,13 @@ static int mds_reint_link(struct mds_update_record *rec,
        ENTRY;
 
        rc = -ESTALE;
-       de_src = mds_fid2dentry(req->rq_obd, rec->ur_fid1, &mnt);
+       de_src = mds_fid2dentry(req->rq_obd, rec->ur_fid1, NULL);
        if (IS_ERR(de_src)) { 
                EXIT;
                goto out_link;
        }
 
-       de_tgt_dir = mds_fid2dentry(req->rq_obd, rec->ur_fid2, &mnt);
+       de_tgt_dir = mds_fid2dentry(req->rq_obd, rec->ur_fid2, NULL);
        if (IS_ERR(de_tgt_dir)) { 
                rc = -ESTALE;
                EXIT;
@@ -276,7 +272,6 @@ static int mds_reint_link(struct mds_update_record *rec,
 static int mds_reint_rename(struct mds_update_record *rec, 
                            struct ptlrpc_request *req)
 {
-       struct vfsmount *mnt;
        struct dentry *de_srcdir = NULL;
        struct dentry *de_tgtdir = NULL;
        struct dentry *de_old = NULL; 
@@ -285,13 +280,13 @@ static int mds_reint_rename(struct mds_update_record *rec,
        ENTRY;
 
        rc = -ESTALE;
-       de_srcdir = mds_fid2dentry(req->rq_obd, rec->ur_fid1, &mnt);
+       de_srcdir = mds_fid2dentry(req->rq_obd, rec->ur_fid1, NULL);
        if (IS_ERR(de_srcdir)) { 
                EXIT;
                goto out_rename;
        }
 
-       de_tgtdir = mds_fid2dentry(req->rq_obd, rec->ur_fid2, &mnt);
+       de_tgtdir = mds_fid2dentry(req->rq_obd, rec->ur_fid2, NULL);
        if (IS_ERR(de_tgtdir)) { 
                rc = -ESTALE;
                EXIT;
index a087eb0..741e029 100755 (executable)
@@ -29,7 +29,7 @@ add_uuid ost
 quit
 EOF
 
-dd if=/dev/zero of=/tmp/ost bs=1024 count=10000
+dd if=/dev/zero of=/tmp/ost bs=1024 count=30000
 mke2fs -b 4096 -F /tmp/ost
 losetup ${LOOP}0 /tmp/ost || exit -1