vserver 1.9.5.x5
[linux-2.6.git] / fs / udf / inode.c
index 68245ca..0506e11 100644 (file)
@@ -69,30 +69,6 @@ static void udf_update_extents(struct inode *,
        kernel_lb_addr, uint32_t, struct buffer_head **);
 static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int);
 
-/*
- * udf_put_inode
- *
- * PURPOSE
- *
- * DESCRIPTION
- *     This routine is called whenever the kernel no longer needs the inode.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- *
- *  Called at each iput()
- */
-void udf_put_inode(struct inode * inode)
-{
-       if (!(inode->i_sb->s_flags & MS_RDONLY))
-       {
-               lock_kernel();
-               udf_discard_prealloc(inode);
-               unlock_kernel();
-       }
-}
-
 /*
  * udf_delete_inode
  *
@@ -129,6 +105,12 @@ no_delete:
 
 void udf_clear_inode(struct inode *inode)
 {
+       if (!(inode->i_sb->s_flags & MS_RDONLY)) {
+               lock_kernel();
+               udf_discard_prealloc(inode);
+               unlock_kernel();
+       }
+
        kfree(UDF_I_DATA(inode));
        UDF_I_DATA(inode) = NULL;
 }
@@ -568,7 +550,7 @@ static struct buffer_head * inode_getblk(struct inode * inode, long block,
        *new = 1;
        UDF_I_NEXT_ALLOC_BLOCK(inode) = block;
        UDF_I_NEXT_ALLOC_GOAL(inode) = newblocknum;
-       inode->i_ctime = CURRENT_TIME;
+       inode->i_ctime = current_fs_time(inode->i_sb);
 
        if (IS_SYNC(inode))
                udf_sync_inode(inode);
@@ -912,7 +894,7 @@ void udf_truncate(struct inode * inode)
                udf_truncate_extents(inode);
        }       
 
-       inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+       inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
        if (IS_SYNC(inode))
                udf_sync_inode (inode);
        else
@@ -920,30 +902,6 @@ void udf_truncate(struct inode * inode)
        unlock_kernel();
 }
 
-/*
- * udf_read_inode
- *
- * PURPOSE
- *     Read an inode.
- *
- * DESCRIPTION
- *     This routine is called by iget() [which is called by udf_iget()]
- *      (clean_inode() will have been called first)
- *     when an inode is first read into memory.
- *
- * HISTORY
- *     July 1, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- *
- * 12/19/98 dgb  Updated to fix size problems.
- */
-
-void
-udf_read_inode(struct inode *inode)
-{
-       memset(&UDF_I_LOCATION(inode), 0xFF, sizeof(kernel_lb_addr));
-}
-
 static void
 __udf_read_inode(struct inode *inode)
 {
@@ -1567,66 +1525,36 @@ udf_update_inode(struct inode *inode, int do_sync)
        return err;
 }
 
-/*
- * udf_iget
- *
- * PURPOSE
- *     Get an inode.
- *
- * DESCRIPTION
- *     This routine replaces iget() and read_inode().
- *
- * HISTORY
- *     October 3, 1997 - Andrew E. Mileski
- *     Written, tested, and released.
- *
- * 12/19/98 dgb  Added semaphore and changed to be a wrapper of iget
- */
 struct inode *
 udf_iget(struct super_block *sb, kernel_lb_addr ino)
 {
-       struct inode *inode;
-       unsigned long block;
-
-       block = udf_get_lb_pblock(sb, ino, 0);
-
-       /* Get the inode */
-
-       inode = iget(sb, block);
-               /* calls udf_read_inode() ! */
+       unsigned long block = udf_get_lb_pblock(sb, ino, 0);
+       struct inode *inode = iget_locked(sb, block);
 
        if (!inode)
-       {
-               printk(KERN_ERR "udf: iget() failed\n");
                return NULL;
-       }
-       else if (is_bad_inode(inode))
-       {
-               iput(inode);
-               return NULL;
-       }
-       else if (UDF_I_LOCATION(inode).logicalBlockNum == 0xFFFFFFFF &&
-               UDF_I_LOCATION(inode).partitionReferenceNum == 0xFFFF)
-       {
+
+       if (inode->i_state & I_NEW) {
                memcpy(&UDF_I_LOCATION(inode), &ino, sizeof(kernel_lb_addr));
                __udf_read_inode(inode);
-               if (is_bad_inode(inode))
-               {
-                       iput(inode);
-                       return NULL;
-               }
+               unlock_new_inode(inode);
        }
 
-       if ( ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum) )
-       {
+       if (is_bad_inode(inode))
+               goto out_iput;
+
+       if (ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum)) {
                udf_debug("block=%d, partition=%d out of range\n",
                        ino.logicalBlockNum, ino.partitionReferenceNum);
                make_bad_inode(inode);
-               iput(inode);
-               return NULL;
-       }
+               goto out_iput;
+       }
 
        return inode;
+
+ out_iput:
+       iput(inode);
+       return NULL;
 }
 
 int8_t udf_add_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,