[Devel] [SCM] packages/cifs-2.6: heads/dev

Evgeny Sinelnikov sin на etersoft.ru
Пт Окт 23 00:06:47 MSD 2009


Привет,

вижу процесс идёт...

Ну, есть тут один не ясный момент...
Как быть со снятием блокировки? Ты её вообще снимаешь? Это раз...

Как быть если блокировка на какую-то область у нас уже была? Ты
поставим значит на весь вычитываемый кусок на чтение, а у нас уже она
частично стоит... на некотором диапазоне... Это два...

И что? После снятия мы эту блокировку потеряем получается?

К тому же не забудь про два вида оплоков... И два вида блокировок... И
про пересечение этих блокировок...

В целом вроде как верные костыли намечаются... Только я бы потрейсил
реальное взаимодействие двух виндовых клиентов, чтобы понять а как они
работают...


2009/10/22 Pavel Shilovsky <piastry на etersoft.ru>:
> Update of /people/piastry/packages/cifs-2.6.git
>
> Changes statistics since `v2.6.29-13196-g302ab60' follows:
>  fs/cifs/cifsfs.c |   45 ++++++++++++++++++++++++++++++++++++++++++++-
>  fs/cifs/inode.c  |   10 +++-------
>  2 files changed, 47 insertions(+), 8 deletions(-)
>
> Changelog since `v2.6.29-13196-g302ab60' follows:
> commit 92d0d49b584a0aace55abc169abe437c867fa89d
> Author: Pavel Shilovsky <piastryyy на gmail.com>
> Date:   Thu Oct 22 23:53:22 2009 +0400
>
>    [CIFS]: cifs_sync_read
>
>    Fix bugs connected with reading on forcemand shares
>
> Full diff since `v2.6.29-13196-g302ab60' follows:
> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> index 5e6d358..d799e8f 100644
> --- a/fs/cifs/cifsfs.c
> +++ b/fs/cifs/cifsfs.c
> @@ -610,6 +610,49 @@ cifs_get_sb(struct file_system_type *fs_type,
>        return 0;
>  }
>
> +static ssize_t cifs_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
> +{
> +       int retval, read, posix_locking = 0;
> +       struct file_lock pfLock;
> +       struct cifsInodeInfo *cifsInode;
> +       struct cifs_sb_info *cifs_sb;
> +       struct cifsTconInfo *tcon;
> +
> +       cifs_sb = CIFS_SB(filp->f_path.dentry->d_sb);
> +       tcon = cifs_sb->tcon;
> +       if ((tcon->ses->capabilities & CAP_UNIX) &&
> +           (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
> +           ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
> +               posix_locking = 1;
> +
> +       retval = cifs_revalidate(filp->f_path.dentry);
> +       if (retval < 0)
> +               return (ssize_t)retval;
> +
> +       memset(&pfLock, 0, sizeof(pfLock));
> +       pfLock.fl_type = F_RDLCK;
> +       pfLock.fl_start = *ppos;
> +       pfLock.fl_end = *ppos+len;
> +       cifsInode = CIFS_I(filp->f_path.dentry->d_inode);
> +       if (cifsInode == NULL)
> +               return -ENOENT;
> +
> +       if (!CIFS_I(filp->f_path.dentry->d_inode)->clientCanCacheRead && !posix_locking) {
> +               retval = cifs_lock(filp, F_GETLK, &pfLock);
> +               if (retval < 0)
> +                       return (ssize_t)retval;
> +               if (pfLock.fl_type == F_UNLCK)
> +                       read = do_sync_read(filp, buf, len, ppos);
> +               else
> +                       return -EACCES;
> +       } else
> +               read = do_sync_read(filp, buf, len, ppos);
> +
> +       if (read == -EACCES)
> +               read = cifs_user_read(filp, buf, len, ppos);
> +       return read;
> +}
> +
>  static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
>                                   unsigned long nr_segs, loff_t pos)
>  {
> @@ -731,7 +774,7 @@ const struct inode_operations cifs_symlink_inode_ops = {
>  };
>
>  const struct file_operations cifs_file_ops = {
> -       .read = do_sync_read,
> +       .read = cifs_sync_read,
>        .write = do_sync_write,
>        .aio_read = generic_file_aio_read,
>        .aio_write = cifs_file_aio_write,
> diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
> index 9c869a6..a3de4b0 100644
> --- a/fs/cifs/inode.c
> +++ b/fs/cifs/inode.c
> @@ -1598,13 +1598,9 @@ int cifs_revalidate(struct dentry *direntry)
>                                if (wbrc)
>                                        CIFS_I(direntry->d_inode)->write_behind_rc = wbrc;
>                        }
> -                       /* may eventually have to do this for open files too */
> -                       if (list_empty(&(cifsInode->openFileList))) {
> -                               /* changed on server - flush read ahead pages */
> -                               cFYI(1, ("Invalidating read ahead data on "
> -                                        "closed file"));
> -                               invalidate_remote_inode(direntry->d_inode);
> -                       }
> +                       cFYI(1, ("Invalidating read ahead data on "
> +                                "closed file"));
> +                       invalidate_remote_inode(direntry->d_inode);
>                }
>        }
>  /*     mutex_unlock(&direntry->d_inode->i_mutex); */
>



-- 
Sin (Sinelnikov Evgeny)


Подробная информация о списке рассылки devel