From c9f668c2c3b809d9d798d023c83ca9dba0f1ac58 Mon Sep 17 00:00:00 2001 From: meijia Date: Fri, 11 Apr 2003 07:48:34 +0000 Subject: [PATCH] [liblustre]: - do proper cleanup with an inode is about to be destroyed --- lustre/liblustre/super.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/lustre/liblustre/super.c b/lustre/liblustre/super.c index eade4dc..de74554 100644 --- a/lustre/liblustre/super.c +++ b/lustre/liblustre/super.c @@ -360,11 +360,57 @@ static int llu_iop_getattr(struct pnode *pno, return 0; } +int llu_mdc_cancel_unused(struct lustre_handle *conn, + struct llu_inode_info *lli, + int flags) +{ + struct ldlm_res_id res_id = + { .name = {lli->lli_st_ino, lli->lli_st_generation} }; + struct obd_device *obddev = class_conn2obd(conn); + ENTRY; + RETURN(ldlm_cli_cancel_unused(obddev->obd_namespace, &res_id, flags)); +} + +static void llu_clear_inode(struct inode *inode) +{ + struct llu_sb_info *sbi = llu_i2sbi(inode); + struct llu_inode_info *lli = llu_i2info(inode); + int rc; + ENTRY; + + CDEBUG(D_INODE, "clear inode: %lu\n", lli->lli_st_ino); + rc = llu_mdc_cancel_unused(&sbi->ll_mdc_conn, lli, + LDLM_FL_NO_CALLBACK); + if (rc < 0) { + CERROR("ll_mdc_cancel_unused: %d\n", rc); + /* XXX FIXME do something dramatic */ + } + + if (lli->lli_smd) { + rc = obd_cancel_unused(&sbi->ll_osc_conn, lli->lli_smd, 0); + if (rc < 0) { + CERROR("obd_cancel_unused: %d\n", rc); + /* XXX FIXME do something dramatic */ + } + } + + if (lli->lli_smd) + obd_free_memmd(&sbi->ll_osc_conn, &lli->lli_smd); + + if (lli->lli_symlink_name) { + OBD_FREE(lli->lli_symlink_name, + strlen(lli->lli_symlink_name) + 1); + lli->lli_symlink_name = NULL; + } + + EXIT; +} + void llu_iop_gone(struct inode *inode) { struct llu_inode_info *lli = llu_i2info(inode); - /* FIXME do proper cleanup here */ + llu_clear_inode(inode); OBD_FREE(lli, sizeof(*lli)); } -- 1.8.3.1