From: braam Date: Fri, 22 Feb 2002 23:35:51 +0000 (+0000) Subject: MDS wasn't handling refcount on vfsmount's correctly, X-Git-Tag: v1_7_100~5988 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=6ea46c305e3a0a018a1707aa2060ff68a4d94269;p=fs%2Flustre-release.git MDS wasn't handling refcount on vfsmount's correctly, resulting in oops. --- diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index a6ad4f6..c9cb6c6 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -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; } diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c index e2c7404..bb94080 100644 --- a/lustre/mds/mds_reint.c +++ b/lustre/mds/mds_reint.c @@ -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; diff --git a/lustre/tests/llmount.sh b/lustre/tests/llmount.sh index a087eb0..741e029 100755 --- a/lustre/tests/llmount.sh +++ b/lustre/tests/llmount.sh @@ -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