From bcc8811cbc10202998cf933a9b1d6d73eb6be738 Mon Sep 17 00:00:00 2001 From: huanghua Date: Mon, 9 Oct 2006 09:21:49 +0000 Subject: [PATCH] more comments on why we need to set nlink to zero for a dir. --- lustre/osd/osd_handler.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index 5bc2208..45c6af0 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -445,11 +445,23 @@ static int osd_inode_remove(const struct lu_env *env, dentry = d_alloc(osd->od_obj_area, &oti->oti_str); if (dentry != NULL) { struct inode *dir = osd->od_obj_area->d_inode; + + /* + * The nlink is 0 now. But to avoid warning message, + * I set it to 1, and unlink() will decrease it to 0. + */ obj->oo_inode->i_nlink = 1; d_instantiate(dentry, obj->oo_inode); result = dir->i_op->unlink(dir, dentry); - obj->oo_inode->i_nlink = 0; - mark_inode_dirty(obj->oo_inode); + if (S_ISDIR(obj->oo_inode->i_mode)) { + /* + * The nlink of a dir was not decreased to + * less than 2. see ldiskfs_unlink() and + * ldiskfs_dec_count(). + */ + obj->oo_inode->i_nlink = 0; + mark_inode_dirty(obj->oo_inode); + } dput(dentry); } else #endif -- 1.8.3.1