From 4d5e699b41a64698b63167cf638d2712cae9ec52 Mon Sep 17 00:00:00 2001 From: "Michael I. Bushnell" Date: Wed, 13 Sep 1995 16:30:20 +0000 Subject: (diskfs_lookup): Don't attempt to lock NP if NPP is not set. Don't even set NP if NPP is not set; use INUM as "lookup succeeded flag" instead. Lookups for REMOVE now *must* set NPP. --- ufs/dir.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/ufs/dir.c b/ufs/dir.c index 1d7004d8..ab98d4bb 100644 --- a/ufs/dir.c +++ b/ufs/dir.c @@ -100,6 +100,9 @@ diskfs_lookup (struct node *dp, char *name, enum lookup_type type, int blockaddr; int idx; + if (type == REMOVE) + assert (npp); + if (npp) *npp = 0; @@ -166,7 +169,7 @@ diskfs_lookup (struct node *dp, char *name, enum lookup_type type, think about that as an error yet. */ err = 0; - if (inum) + if (inum && npp) { if (namelen != 2 || name[0] != '.' || name[1] != '.') { @@ -242,15 +245,15 @@ diskfs_lookup (struct node *dp, char *name, enum lookup_type type, /* If we will be modifying the directory, make sure it's allowed. */ if (type == RENAME - || (type == REMOVE && np) - || (type == CREATE && !np)) + || (type == REMOVE && inum) + || (type == CREATE && !inum)) { err = diskfs_checkdirmod (dp, np, cred); if (err) goto out; } - if ((type == CREATE || type == RENAME) && !np && ds && ds->stat == LOOKING) + if ((type == CREATE || type == RENAME) && !inum && ds && ds->stat == LOOKING) { /* We didn't find any room, so mark ds to extend the dir */ ds->type = CREATE; @@ -274,7 +277,8 @@ diskfs_lookup (struct node *dp, char *name, enum lookup_type type, if (np) { - if (err || !npp) + assert (npp); + if (err) { if (!spec_dotdot) { @@ -292,11 +296,11 @@ diskfs_lookup (struct node *dp, char *name, enum lookup_type type, /* We did iget */ diskfs_nput (np); } - else if (npp) + else *npp = np; } - return err ? : np ? 0 : ENOENT; + return err ? : inum ? 0 : ENOENT; } /* Scan block at address BLKADDR (of node DP; block index IDX), for -- cgit v1.2.3