lkml.org 
[lkml]   [2007]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 03/31] IGET: Introduce a function to register iget failure [try #3]
    Date
    Introduce a function to register failure in an inode construction path.  This
    includes marking the inode under construction as bad, unlocking it and
    releasing it.

    Signed-off-by: David Howells <dhowells@redhat.com>
    ---

    Documentation/filesystems/porting | 18 +++++++++++++-----
    fs/bad_inode.c | 14 ++++++++++++++
    include/linux/fs.h | 1 +
    3 files changed, 28 insertions(+), 5 deletions(-)

    diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting
    index dac45c9..3b0fb22 100644
    --- a/Documentation/filesystems/porting
    +++ b/Documentation/filesystems/porting
    @@ -184,11 +184,19 @@ just takes the superblock and inode number as arguments and does the
    test and set for you.

    e.g.
    - inode = iget_locked(sb, ino);
    - if (inode->i_state & I_NEW) {
    - read_inode_from_disk(inode);
    - unlock_new_inode(inode);
    - }
    + inode = iget_locked(sb, ino);
    + if (inode->i_state & I_NEW) {
    + err = read_inode_from_disk(inode);
    + if (err < 0) {
    + iget_failed(inode);
    + return err;
    + }
    + unlock_new_inode(inode);
    + }
    +
    +Note that if the process of setting up a new inode fails, then iget_failed()
    +should be called on the inode to render it dead, and an appropriate error
    +should be passed back to the caller.

    ---
    [recommended]
    diff --git a/fs/bad_inode.c b/fs/bad_inode.c
    index 521ff7c..f1c2ea8 100644
    --- a/fs/bad_inode.c
    +++ b/fs/bad_inode.c
    @@ -359,3 +359,17 @@ int is_bad_inode(struct inode *inode)
    }

    EXPORT_SYMBOL(is_bad_inode);
    +
    +/**
    + * iget_failed - Mark an under-construction inode as dead and release it
    + * @inode: The inode to discard
    + *
    + * Mark an under-construction inode as dead and release it.
    + */
    +void iget_failed(struct inode *inode)
    +{
    + make_bad_inode(inode);
    + unlock_new_inode(inode);
    + iput(inode);
    +}
    +EXPORT_SYMBOL(iget_failed);
    diff --git a/include/linux/fs.h b/include/linux/fs.h
    index 16421f6..c24d433 100644
    --- a/include/linux/fs.h
    +++ b/include/linux/fs.h
    @@ -1631,6 +1631,7 @@ static inline struct inode *iget(struct super_block *sb, unsigned long ino)
    }

    extern void __iget(struct inode * inode);
    +extern void iget_failed(struct inode *);
    extern void clear_inode(struct inode *);
    extern void destroy_inode(struct inode *);
    extern struct inode *new_inode(struct super_block *);
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-10-10 23:59    [W:0.037 / U:0.344 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site