summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael I. Bushnell <mib@gnu.org>1995-09-13 16:30:20 +0000
committerMichael I. Bushnell <mib@gnu.org>1995-09-13 16:30:20 +0000
commitb6d7707a397cec1abccdf558ba180112cd04a149 (patch)
treeaf96dd492206e64d67d72d2cd8fd60d7f2e66192
parent42311cc0dcaba1f42d7f1c0a0fd242eaf9ddeb2d (diff)
(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.
-rw-r--r--ufs/dir.c18
1 files 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