patch-2.4.27 linux-2.4.27/fs/jfs/namei.c
Next file: linux-2.4.27/fs/jfs/super.c
Previous file: linux-2.4.27/fs/jfs/jfs_xtree.c
Back to the patch index
Back to the overall index
- Lines: 260
- Date:
2004-08-07 16:26:06.007402372 -0700
- Orig file:
linux-2.4.26/fs/jfs/namei.c
- Orig date:
2004-04-14 06:05:40.000000000 -0700
diff -urN linux-2.4.26/fs/jfs/namei.c linux-2.4.27/fs/jfs/namei.c
@@ -130,7 +130,6 @@
insert_inode_hash(ip);
mark_inode_dirty(ip);
- d_instantiate(dentry, ip);
dip->i_ctime = dip->i_mtime = CURRENT_TIME;
@@ -145,7 +144,8 @@
if (rc) {
ip->i_nlink = 0;
iput(ip);
- }
+ } else
+ d_instantiate(dentry, ip);
out2:
free_UCSname(&dname);
@@ -254,7 +254,6 @@
insert_inode_hash(ip);
mark_inode_dirty(ip);
- d_instantiate(dentry, ip);
/* update parent directory inode */
dip->i_nlink++; /* for '..' from child directory */
@@ -270,7 +269,8 @@
if (rc) {
ip->i_nlink = 0;
iput(ip);
- }
+ } else
+ d_instantiate(dentry, ip);
out2:
free_UCSname(&dname);
@@ -784,26 +784,30 @@
goto out;
if ((rc = dtSearch(dir, &dname, &ino, &btstack, JFS_CREATE)))
- goto out;
+ goto free_dname;
/*
* create entry for new link in parent directory
*/
ino = ip->i_ino;
if ((rc = dtInsert(tid, dir, &dname, &ino, &btstack)))
- goto out;
+ goto free_dname;
/* update object inode */
ip->i_nlink++; /* for new link */
ip->i_ctime = CURRENT_TIME;
mark_inode_dirty(dir);
atomic_inc(&ip->i_count);
- d_instantiate(dentry, ip);
iplist[0] = ip;
iplist[1] = dir;
rc = txCommit(tid, 2, &iplist[0], 0);
+ if (!rc)
+ d_instantiate(dentry, ip);
+ free_dname:
+ free_UCSname(&dname);
+
out:
txEnd(tid);
@@ -845,7 +849,7 @@
unchar *i_fastsymlink;
s64 xlen = 0;
int bmask = 0, xsize;
- s64 xaddr;
+ s64 extent = 0, xaddr;
struct metapage *mp;
struct super_block *sb;
struct tblock *tblk;
@@ -879,28 +883,10 @@
down(&JFS_IP(dip)->commit_sem);
down(&JFS_IP(ip)->commit_sem);
- if ((rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE)))
- goto out3;
-
tblk = tid_to_tblock(tid);
tblk->xflag |= COMMIT_CREATE;
tblk->ip = ip;
- /*
- * create entry for symbolic link in parent directory
- */
-
- ino = ip->i_ino;
-
-
-
- if ((rc = dtInsert(tid, dip, &dname, &ino, &btstack))) {
- jfs_err("jfs_symlink: dtInsert returned %d", rc);
- /* discard ne inode */
- goto out3;
-
- }
-
/* fix symlink access permission
* (dir_create() ANDs in the u.u_cmask,
* but symlinks really need to be 777 access)
@@ -908,7 +894,7 @@
ip->i_mode |= 0777;
/*
- * write symbolic link target path name
+ * write symbolic link target path name
*/
xtInitRoot(tid, ip);
@@ -952,64 +938,60 @@
xsize = (ssize + bmask) & ~bmask;
xaddr = 0;
xlen = xsize >> JFS_SBI(sb)->l2bsize;
- if ((rc = xtInsert(tid, ip, 0, 0, xlen, &xaddr, 0)) == 0) {
- ip->i_size = ssize - 1;
- while (ssize) {
- int copy_size = min(ssize, PSIZE);
-
- mp = get_metapage(ip, xaddr, PSIZE, 1);
-
- if (mp == NULL) {
- dtDelete(tid, dip, &dname, &ino,
- JFS_REMOVE);
- rc = -EIO;
- goto out3;
- }
- memcpy(mp->data, name, copy_size);
- flush_metapage(mp);
-#if 0
- mark_buffer_uptodate(bp, 1);
- mark_buffer_dirty(bp, 1);
- if (IS_SYNC(dip)) {
- ll_rw_block(WRITE, 1, &bp);
- wait_on_buffer(bp);
- }
- brelse(bp);
-#endif /* 0 */
- ssize -= copy_size;
- xaddr += JFS_SBI(sb)->nbperpage;
- }
- ip->i_blocks = LBLK2PBLK(sb, xlen);
- } else {
- dtDelete(tid, dip, &dname, &ino, JFS_REMOVE);
+ if ((rc = xtInsert(tid, ip, 0, 0, xlen, &xaddr, 0))) {
+ txAbort(tid, 0);
rc = -ENOSPC;
goto out3;
}
+ extent = xaddr;
+ ip->i_size = ssize - 1;
+ while (ssize) {
+ /* This is kind of silly since PATH_MAX == 4K */
+ int copy_size = min(ssize, PSIZE);
+
+ mp = get_metapage(ip, xaddr, PSIZE, 1);
+
+ if (mp == NULL) {
+ dbFree(ip, extent, xlen);
+ rc = -EIO;
+ txAbort(tid, 0);
+ goto out3;
+ }
+ memcpy(mp->data, name, copy_size);
+ flush_metapage(mp);
+ ssize -= copy_size;
+ name += copy_size;
+ xaddr += JFS_SBI(sb)->nbperpage;
+ }
+ ip->i_blocks = LBLK2PBLK(sb, xlen);
+ }
+
+ /*
+ * create entry for symbolic link in parent directory
+ */
+ rc = dtSearch(dip, &dname, &ino, &btstack, JFS_CREATE);
+ if (rc == 0) {
+ ino = ip->i_ino;
+ rc = dtInsert(tid, dip, &dname, &ino, &btstack);
+ }
+ if (rc) {
+ if (xlen)
+ dbFree(ip, extent, xlen);
+ txAbort(tid, 0);
+ /* discard new inode */
+ goto out3;
}
insert_inode_hash(ip);
mark_inode_dirty(ip);
- d_instantiate(dentry, ip);
/*
* commit update of parent directory and link object
- *
- * if extent allocation failed (ENOSPC),
- * the parent inode is committed regardless to avoid
- * backing out parent directory update (by dtInsert())
- * and subsequent dtDelete() which is harmless wrt
- * integrity concern.
- * the symlink inode will be freed by iput() at exit
- * as it has a zero link count (by dtDelete()) and
- * no permanant resources.
*/
iplist[0] = dip;
- if (rc == 0) {
- iplist[1] = ip;
- rc = txCommit(tid, 2, &iplist[0], 0);
- } else
- rc = txCommit(tid, 1, &iplist[0], 0);
+ iplist[1] = ip;
+ rc = txCommit(tid, 2, &iplist[0], 0);
out3:
txEnd(tid);
@@ -1018,7 +1000,8 @@
if (rc) {
ip->i_nlink = 0;
iput(ip);
- }
+ } else
+ d_instantiate(dentry, ip);
out2:
free_UCSname(&dname);
@@ -1208,7 +1191,7 @@
/* Linelock header of dtree */
tlck = txLock(tid, old_ip,
(struct metapage *) &JFS_IP(old_ip)->bxflag,
- tlckDTREE | tlckBTROOT);
+ tlckDTREE | tlckBTROOT | tlckRELINK);
dtlck = (struct dt_lock *) & tlck->lock;
ASSERT(dtlck->index == 0);
lv = & dtlck->lv[0];
@@ -1348,7 +1331,6 @@
insert_inode_hash(ip);
mark_inode_dirty(ip);
- d_instantiate(dentry, ip);
dir->i_ctime = dir->i_mtime = CURRENT_TIME;
@@ -1365,7 +1347,8 @@
if (rc) {
ip->i_nlink = 0;
iput(ip);
- }
+ } else
+ d_instantiate(dentry, ip);
out1:
free_UCSname(&dname);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)