[linux-cifs-client] Re: [PATCH 1/7] [CIFS] add local struct inode pointer to cifs_setattr

Steve French smfrench at gmail.com
Fri May 9 22:29:12 GMT 2008


Merged patches 1, 6 and 7 from this series.

For the others since they change current behavior and would break some
apps (including connectathon test cases) would like the behavior e.g.
to be configurable by mount option

On Mon, May 5, 2008 at 2:16 PM, Jeff Layton <jlayton at redhat.com> wrote:
> Clean up cifs_setattr a bit by adding a local inode pointer, and
> changing all of the direntry->d_inode references to it. This also adds a
> bit of micro-optimization. d_inode shouldn't change over the life of
> this function, so we only need to dereference it once.
>
> Signed-off-by: Jeff Layton <jlayton at redhat.com>
> ---
>  fs/cifs/inode.c |   20 ++++++++++----------
>  1 files changed, 10 insertions(+), 10 deletions(-)
>
> diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
> index 0d9d2e6..d904a03 100644
> --- a/fs/cifs/inode.c
> +++ b/fs/cifs/inode.c
> @@ -1408,18 +1408,19 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
>        __u64 uid = 0xFFFFFFFFFFFFFFFFULL;
>        __u64 gid = 0xFFFFFFFFFFFFFFFFULL;
>        struct cifsInodeInfo *cifsInode;
> +       struct inode *inode = direntry->d_inode;
>
>        xid = GetXid();
>
>        cFYI(1, ("setattr on file %s attrs->iavalid 0x%x",
>                 direntry->d_name.name, attrs->ia_valid));
>
> -       cifs_sb = CIFS_SB(direntry->d_inode->i_sb);
> +       cifs_sb = CIFS_SB(inode->i_sb);
>        pTcon = cifs_sb->tcon;
>
>        if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) == 0) {
>                /* check if we have permission to change attrs */
> -               rc = inode_change_ok(direntry->d_inode, attrs);
> +               rc = inode_change_ok(inode, attrs);
>                if (rc < 0) {
>                        FreeXid(xid);
>                        return rc;
> @@ -1432,7 +1433,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
>                FreeXid(xid);
>                return -ENOMEM;
>        }
> -       cifsInode = CIFS_I(direntry->d_inode);
> +       cifsInode = CIFS_I(inode);
>
>        if ((attrs->ia_valid & ATTR_MTIME) || (attrs->ia_valid & ATTR_SIZE)) {
>                /*
> @@ -1443,9 +1444,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
>                   will be truncated anyway? Also, should we error out here if
>                   the flush returns error?
>                 */
> -               rc = filemap_write_and_wait(direntry->d_inode->i_mapping);
> +               rc = filemap_write_and_wait(inode->i_mapping);
>                if (rc != 0) {
> -                       CIFS_I(direntry->d_inode)->write_behind_rc = rc;
> +                       cifsInode->write_behind_rc = rc;
>                        rc = 0;
>                }
>        }
> @@ -1521,9 +1522,8 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
>                   */
>
>                if (rc == 0) {
> -                       rc = cifs_vmtruncate(direntry->d_inode, attrs->ia_size);
> -                       cifs_truncate_page(direntry->d_inode->i_mapping,
> -                                          direntry->d_inode->i_size);
> +                       rc = cifs_vmtruncate(inode, attrs->ia_size);
> +                       cifs_truncate_page(inode->i_mapping, inode->i_size);
>                } else
>                        goto cifs_setattr_exit;
>        }
> @@ -1557,7 +1557,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
>                rc = 0;
>  #ifdef CONFIG_CIFS_EXPERIMENTAL
>                if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL)
> -                       rc = mode_to_acl(direntry->d_inode, full_path, mode);
> +                       rc = mode_to_acl(inode, full_path, mode);
>                else if ((mode & S_IWUGO) == 0) {
>  #else
>                if ((mode & S_IWUGO) == 0) {
> @@ -1665,7 +1665,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
>        /* do not need local check to inode_check_ok since the server does
>           that */
>        if (!rc)
> -               rc = inode_setattr(direntry->d_inode, attrs);
> +               rc = inode_setattr(inode, attrs);
>  cifs_setattr_exit:
>        kfree(full_path);
>        FreeXid(xid);
> --
> 1.5.3.6
>
>



-- 
Thanks,

Steve


More information about the linux-cifs-client mailing list