Re: linux-next: Tree for December 3 (cifs)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 6 Dec 2010 10:24:59 -0600
Steve French <smfrench@xxxxxxxxx> wrote:

> On Mon, Dec 6, 2010 at 10:22 AM, Shirish Pargaonkar <
> shirishpargaonkar@xxxxxxxxx> wrote:
> 
> > On Mon, Dec 6, 2010 at 9:50 AM, Jeff Layton <jlayton@xxxxxxxxxx> wrote:
> > > On Mon, 6 Dec 2010 09:40:33 -0600
> > > Shirish Pargaonkar <shirishpargaonkar@xxxxxxxxx> wrote:
> > >
> > >> On Mon, Dec 6, 2010 at 6:35 AM, Jeff Layton <jlayton@xxxxxxxxxx> wrote:
> > >> > On Mon, 6 Dec 2010 08:09:56 +0100
> > >> > Ingo Molnar <mingo@xxxxxxx> wrote:
> > >> >
> > >> >>
> > >> >> * Randy Dunlap <randy.dunlap@xxxxxxxxxx> wrote:
> > >> >>
> > >> >> > On Fri, 3 Dec 2010 13:04:40 +1100 Stephen Rothwell wrote:
> > >> >> >
> > >> >> > > Hi all,
> > >> >> > >
> > >> >> > > Changes since 20101202:
> > >> >> >
> > >> >> >
> > >> >> > When CIFS_EXPERIMENTAL is not enabled:
> > >> >> >
> > >> >> > (.text+0xdf6c9): undefined reference to `get_cifs_acl'
> > >> >> >
> > >> >> > from fs/cifs/xattr.c:cifs_getxattr()
> > >> >> >
> > >> >> >
> > >> >> > CONFIG_CIFS=y
> > >> >> > # CONFIG_CIFS_STATS is not set
> > >> >> > CONFIG_CIFS_WEAK_PW_HASH=y
> > >> >> > # CONFIG_CIFS_UPCALL is not set
> > >> >> > CONFIG_CIFS_XATTR=y
> > >> >> > CONFIG_CIFS_POSIX=y
> > >> >> > # CONFIG_CIFS_DEBUG2 is not set
> > >> >> > # CONFIG_CIFS_DFS_UPCALL is not set
> > >> >> > CONFIG_CIFS_FSCACHE=y
> > >> >> > CONFIG_CIFS_ACL=y
> > >> >> > # CONFIG_CIFS_EXPERIMENTAL is not set
> > >> >>
> > >> >> And this build regression has been pushed upstream now, as of:
> > >> >>
> > >> >>    8520eeaa1235: Merge git://
> > git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
> > >> >>
> > >> >> and it is triggering for me too:
> > >> >>
> > >> >>    fs/built-in.o: In function `cifs_getxattr':
> > >> >>    (.text+0xc518e): undefined reference to `get_cifs_acl'
> > >> >>
> > >> >> The regression got introduced by:
> > >> >>
> > >> >>    fbeba8bb16d7: cifs: Handle extended attribute name cifs_acl to
> > generate cifs acl blob (try #4)
> > >> >>
> > >> >> Which introduced the new CIFS_ACL option.
> > >> >>
> > >> >> Thanks,
> > >> >>
> > >> >>       Ingo
> > >> >
> > >> > Yeah, looks like this new Kconfig option depends on some code that's
> > >> > under the (much-overloaded) CIFS_EXPERIMENTAL Kconfig option. I think
> > >> > this patch needs some rework. The simple fix would be to make it
> > >> > dependent on CIFS_EXPERIMENTAL, but that's rather icky since
> > >>
> > >> Making CONFIG_CIFS_ACL dependent on CONFIG_CIFS_EXPERIMENTAL
> > >> works
> > >>
> > >>  config CIFS_ACL
> > >>           bool "Provide CIFS ACL support (EXPERIMENTAL)"
> > >> -         depends on EXPERIMENTAL && CIFS_XATTR
> > >> +         depends on CIFS_EXPERIMENTAL && CIFS_XATTR
> > >>           help
> > >>             Allows to fetch CIFS/NTFS ACL from the server.  The DACL
> > blob
> > >>             is handed over to the application/caller.
> > >>
> > >> At the minimum function find_readable_file() and three functions
> > >> in cifssmb.c would not have to be in CIFS_EXPERIMENTAL.
> > >> And we would need to move some other cifs acl related functions
> > >> from under CIFS_ACL from CIFS_EXPERIMENTAL.
> > >>
> > >
> > > Ugh, let's not do that. CONFIG_CIFS_EXPERIMENTAL is like a box of
> > > chocolates...when you enable it you just never know what you're going
> > > to get...
> > >
> > > I think the patch below is a better way to deal with this. It's larger
> > > than I would like to see at this point in the release cycle, but we
> > > might as well fix it the right way.
> > >
> > > I also have some other patches to clean up CONFIG_CIFS_EXPERIMENTAL,
> > > but I'll send those along separately for 2.6.38.
> > >
> > > Steve, if this looks good, I'll send it along to you as a "formal"
> > > patch for inclusion via your tree.
> > >
> > > -------------------[snip]---------------------
> > >
> > > cifs: fix use of CONFIG_CIFS_ACL
> > >
> > > Some of the code under CONFIG_CIFS_ACL is dependent upon code under
> > > CONFIG_CIFS_EXPERIMENTAL, but the Kconfig options don't reflect that
> > > dependency. Move more of the ACL code out from under
> > > CONFIG_CIFS_EXPERIMENTAL and under CONFIG_CIFS_ACL.
> > >
> > > Also move find_readable_file out from other any sort of Kconfig
> > > option and make it a function normally compiled in.
> > >
> > > Reported-by: Randy Dunlap <randy.dunlap@xxxxxxxxxx>
> > > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
> > > ---
> > >  fs/cifs/Makefile    |    4 +-
> > >  fs/cifs/cifsacl.c   |    3 -
> > >  fs/cifs/cifsacl.h   |    4 -
> > >  fs/cifs/cifsproto.h |    2 -
> > >  fs/cifs/cifssmb.c   |  183
> > ++++++++++++++++++++++++++-------------------------
> > >  fs/cifs/file.c      |    2 -
> > >  fs/cifs/inode.c     |    8 +-
> > >  7 files changed, 99 insertions(+), 107 deletions(-)
> > >
> > > diff --git a/fs/cifs/Makefile b/fs/cifs/Makefile
> > > index adefa60..43b19dd 100644
> > > --- a/fs/cifs/Makefile
> > > +++ b/fs/cifs/Makefile
> > > @@ -6,7 +6,9 @@ obj-$(CONFIG_CIFS) += cifs.o
> > >  cifs-y := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o
> > \
> > >          link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o
> > \
> > >          md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o \
> > > -         readdir.o ioctl.o sess.o export.o cifsacl.o
> > > +         readdir.o ioctl.o sess.o export.o
> > > +
> > > +cifs-$(CONFIG_CIFS_ACL) += cifsacl.o
> > >
> > >  cifs-$(CONFIG_CIFS_UPCALL) += cifs_spnego.o
> > >
> > > diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c
> > > index c6ebea0..a437ec3 100644
> > > --- a/fs/cifs/cifsacl.c
> > > +++ b/fs/cifs/cifsacl.c
> > > @@ -30,8 +30,6 @@
> > >  #include "cifs_debug.h"
> > >
> > >
> > > -#ifdef CONFIG_CIFS_EXPERIMENTAL
> > > -
> > >  static struct cifs_wksid wksidarr[NUM_WK_SIDS] = {
> > >        {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"},
> > >        {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"},
> > > @@ -774,4 +772,3 @@ int mode_to_cifs_acl(struct inode *inode, const char
> > *path, __u64 nmode)
> > >
> > >        return rc;
> > >  }
> > > -#endif /* CONFIG_CIFS_EXPERIMENTAL */
> > > diff --git a/fs/cifs/cifsacl.h b/fs/cifs/cifsacl.h
> > > index 6c8096c..c4ae7d0 100644
> > > --- a/fs/cifs/cifsacl.h
> > > +++ b/fs/cifs/cifsacl.h
> > > @@ -74,11 +74,7 @@ struct cifs_wksid {
> > >        char sidname[SIDNAMELENGTH];
> > >  } __attribute__((packed));
> > >
> > > -#ifdef CONFIG_CIFS_EXPERIMENTAL
> > > -
> > >  extern int match_sid(struct cifs_sid *);
> > >  extern int compare_sids(const struct cifs_sid *, const struct cifs_sid
> > *);
> > >
> > > -#endif /*  CONFIG_CIFS_EXPERIMENTAL */
> > > -
> > >  #endif /* _CIFSACL_H */
> > > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> > > index 38cdec9..cb65499 100644
> > > --- a/fs/cifs/cifsproto.h
> > > +++ b/fs/cifs/cifsproto.h
> > > @@ -80,9 +80,7 @@ extern bool is_valid_oplock_break(struct smb_hdr *smb,
> > >                                  struct TCP_Server_Info *);
> > >  extern bool is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof);
> > >  extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *,
> > bool);
> > > -#ifdef CONFIG_CIFS_EXPERIMENTAL
> > >  extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *,
> > bool);
> > > -#endif
> > >  extern unsigned int smbCalcSize(struct smb_hdr *ptr);
> > >  extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr);
> > >  extern int decode_negTokenInit(unsigned char *security_blob, int length,
> > > diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
> > > index 0ef7c3a..d7957a3 100644
> > > --- a/fs/cifs/cifssmb.c
> > > +++ b/fs/cifs/cifssmb.c
> > > @@ -2478,95 +2478,6 @@ querySymLinkRetry:
> > >  }
> > >
> > >  #ifdef CONFIG_CIFS_EXPERIMENTAL
> > > -/* Initialize NT TRANSACT SMB into small smb request buffer.
> > > -   This assumes that all NT TRANSACTS that we init here have
> > > -   total parm and data under about 400 bytes (to fit in small cifs
> > > -   buffer size), which is the case so far, it easily fits. NB:
> > > -       Setup words themselves and ByteCount
> > > -       MaxSetupCount (size of returned setup area) and
> > > -       MaxParameterCount (returned parms size) must be set by caller */
> > > -static int
> > > -smb_init_nttransact(const __u16 sub_command, const int setup_count,
> > > -                  const int parm_len, struct cifsTconInfo *tcon,
> > > -                  void **ret_buf)
> > > -{
> > > -       int rc;
> > > -       __u32 temp_offset;
> > > -       struct smb_com_ntransact_req *pSMB;
> > > -
> > > -       rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon,
> > > -                               (void **)&pSMB);
> > > -       if (rc)
> > > -               return rc;
> > > -       *ret_buf = (void *)pSMB;
> > > -       pSMB->Reserved = 0;
> > > -       pSMB->TotalParameterCount = cpu_to_le32(parm_len);
> > > -       pSMB->TotalDataCount  = 0;
> > > -       pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf -
> > > -                                         MAX_CIFS_HDR_SIZE) &
> > 0xFFFFFF00);
> > > -       pSMB->ParameterCount = pSMB->TotalParameterCount;
> > > -       pSMB->DataCount  = pSMB->TotalDataCount;
> > > -       temp_offset = offsetof(struct smb_com_ntransact_req, Parms) +
> > > -                       (setup_count * 2) - 4 /* for rfc1001 length
> > itself */;
> > > -       pSMB->ParameterOffset = cpu_to_le32(temp_offset);
> > > -       pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len);
> > > -       pSMB->SetupCount = setup_count; /* no need to le convert byte
> > fields */
> > > -       pSMB->SubCommand = cpu_to_le16(sub_command);
> > > -       return 0;
> > > -}
> > > -
> > > -static int
> > > -validate_ntransact(char *buf, char **ppparm, char **ppdata,
> > > -                  __u32 *pparmlen, __u32 *pdatalen)
> > > -{
> > > -       char *end_of_smb;
> > > -       __u32 data_count, data_offset, parm_count, parm_offset;
> > > -       struct smb_com_ntransact_rsp *pSMBr;
> > > -
> > > -       *pdatalen = 0;
> > > -       *pparmlen = 0;
> > > -
> > > -       if (buf == NULL)
> > > -               return -EINVAL;
> > > -
> > > -       pSMBr = (struct smb_com_ntransact_rsp *)buf;
> > > -
> > > -       /* ByteCount was converted from little endian in SendReceive */
> > > -       end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount +
> > > -                       (char *)&pSMBr->ByteCount;
> > > -
> > > -       data_offset = le32_to_cpu(pSMBr->DataOffset);
> > > -       data_count = le32_to_cpu(pSMBr->DataCount);
> > > -       parm_offset = le32_to_cpu(pSMBr->ParameterOffset);
> > > -       parm_count = le32_to_cpu(pSMBr->ParameterCount);
> > > -
> > > -       *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset;
> > > -       *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset;
> > > -
> > > -       /* should we also check that parm and data areas do not overlap?
> > */
> > > -       if (*ppparm > end_of_smb) {
> > > -               cFYI(1, "parms start after end of smb");
> > > -               return -EINVAL;
> > > -       } else if (parm_count + *ppparm > end_of_smb) {
> > > -               cFYI(1, "parm end after end of smb");
> > > -               return -EINVAL;
> > > -       } else if (*ppdata > end_of_smb) {
> > > -               cFYI(1, "data starts after end of smb");
> > > -               return -EINVAL;
> > > -       } else if (data_count + *ppdata > end_of_smb) {
> > > -               cFYI(1, "data %p + count %d (%p) past smb end %p start
> > %p",
> > > -                       *ppdata, data_count, (data_count + *ppdata),
> > > -                       end_of_smb, pSMBr);
> > > -               return -EINVAL;
> > > -       } else if (parm_count + data_count > pSMBr->ByteCount) {
> > > -               cFYI(1, "parm count and data count larger than SMB");
> > > -               return -EINVAL;
> > > -       }
> > > -       *pdatalen = data_count;
> > > -       *pparmlen = parm_count;
> > > -       return 0;
> > > -}
> > > -
> > >  int
> > >  CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
> > >                        const unsigned char *searchName,
> > > @@ -3056,7 +2967,97 @@ GetExtAttrOut:
> > >
> > >  #endif /* CONFIG_POSIX */
> > >
> > > -#ifdef CONFIG_CIFS_EXPERIMENTAL
> > > +#ifdef CONFIG_CIFS_ACL
> > > +/*
> > > + * Initialize NT TRANSACT SMB into small smb request buffer.  This
> > assumes that
> > > + * all NT TRANSACTS that we init here have total parm and data under
> > about 400
> > > + * bytes (to fit in small cifs buffer size), which is the case so far,
> > it
> > > + * easily fits. NB: Setup words themselves and ByteCount MaxSetupCount
> > (size of
> > > + * returned setup area) and MaxParameterCount (returned parms size) must
> > be set
> > > + * by caller
> > > + */
> > > +static int
> > > +smb_init_nttransact(const __u16 sub_command, const int setup_count,
> > > +                  const int parm_len, struct cifsTconInfo *tcon,
> > > +                  void **ret_buf)
> > > +{
> > > +       int rc;
> > > +       __u32 temp_offset;
> > > +       struct smb_com_ntransact_req *pSMB;
> > > +
> > > +       rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon,
> > > +                               (void **)&pSMB);
> > > +       if (rc)
> > > +               return rc;
> > > +       *ret_buf = (void *)pSMB;
> > > +       pSMB->Reserved = 0;
> > > +       pSMB->TotalParameterCount = cpu_to_le32(parm_len);
> > > +       pSMB->TotalDataCount  = 0;
> > > +       pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf -
> > > +                                         MAX_CIFS_HDR_SIZE) &
> > 0xFFFFFF00);
> > > +       pSMB->ParameterCount = pSMB->TotalParameterCount;
> > > +       pSMB->DataCount  = pSMB->TotalDataCount;
> > > +       temp_offset = offsetof(struct smb_com_ntransact_req, Parms) +
> > > +                       (setup_count * 2) - 4 /* for rfc1001 length
> > itself */;
> > > +       pSMB->ParameterOffset = cpu_to_le32(temp_offset);
> > > +       pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len);
> > > +       pSMB->SetupCount = setup_count; /* no need to le convert byte
> > fields */
> > > +       pSMB->SubCommand = cpu_to_le16(sub_command);
> > > +       return 0;
> > > +}
> > > +
> > > +static int
> > > +validate_ntransact(char *buf, char **ppparm, char **ppdata,
> > > +                  __u32 *pparmlen, __u32 *pdatalen)
> > > +{
> > > +       char *end_of_smb;
> > > +       __u32 data_count, data_offset, parm_count, parm_offset;
> > > +       struct smb_com_ntransact_rsp *pSMBr;
> > > +
> > > +       *pdatalen = 0;
> > > +       *pparmlen = 0;
> > > +
> > > +       if (buf == NULL)
> > > +               return -EINVAL;
> > > +
> > > +       pSMBr = (struct smb_com_ntransact_rsp *)buf;
> > > +
> > > +       /* ByteCount was converted from little endian in SendReceive */
> > > +       end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount +
> > > +                       (char *)&pSMBr->ByteCount;
> > > +
> > > +       data_offset = le32_to_cpu(pSMBr->DataOffset);
> > > +       data_count = le32_to_cpu(pSMBr->DataCount);
> > > +       parm_offset = le32_to_cpu(pSMBr->ParameterOffset);
> > > +       parm_count = le32_to_cpu(pSMBr->ParameterCount);
> > > +
> > > +       *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset;
> > > +       *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset;
> > > +
> > > +       /* should we also check that parm and data areas do not overlap?
> > */
> > > +       if (*ppparm > end_of_smb) {
> > > +               cFYI(1, "parms start after end of smb");
> > > +               return -EINVAL;
> > > +       } else if (parm_count + *ppparm > end_of_smb) {
> > > +               cFYI(1, "parm end after end of smb");
> > > +               return -EINVAL;
> > > +       } else if (*ppdata > end_of_smb) {
> > > +               cFYI(1, "data starts after end of smb");
> > > +               return -EINVAL;
> > > +       } else if (data_count + *ppdata > end_of_smb) {
> > > +               cFYI(1, "data %p + count %d (%p) past smb end %p start
> > %p",
> > > +                       *ppdata, data_count, (data_count + *ppdata),
> > > +                       end_of_smb, pSMBr);
> > > +               return -EINVAL;
> > > +       } else if (parm_count + data_count > pSMBr->ByteCount) {
> > > +               cFYI(1, "parm count and data count larger than SMB");
> > > +               return -EINVAL;
> > > +       }
> > > +       *pdatalen = data_count;
> > > +       *pparmlen = parm_count;
> > > +       return 0;
> > > +}
> > > +
> >
> > Jeff, comment being, functions smb_nt_transact and validate_nttransact
> > although used by only cifs acl related functions, probably were not meant
> > to be limited to CIFS_ACL config option code, I think they existed even
> > before cifs acl code came into existence, not 100% sure.
> >
> > smb_nt_transact and validate_nttransact don't need to be in experimental
> ifdef.  They have been around for years.
> 

The problem there is that moving those functions out of the ifdef
will cause a compiler warning about unused functions when
CONFIG_CIFS_ACL is disabled. I think we ought to just leave the patch
as-is. We can always move those functions out from under the ifdef
later if needed...

-- 
Jeff Layton <jlayton@xxxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux