Hi,

Some time ago, I reported an issue (1) regarding to the "disk free"
to Quotas mapping when Unix Extensions are enabled.

The issue still persists in RHEL 5.3 (samba-3.0.33-3.7.el5).

In the meanwhile I have found a workaround via the attached *ugly*
patch, but an official solution would be appreciated.


Best regards,
                Juanjo

(1) https://bugzilla.samba.org/show_bug.cgi?id=5395

-- 
Juan José Villaplana Querol/Servei d'Informàtica/Universitat Jaume I
Powered by Mutt [http://www.mutt.org/]
Dilbert: ... and starting today, all passwords must contain letters,
         numbers, doodles, sign language and squirrel noises.
*** source/smbd/trans2.c.orig   2008-11-18 16:37:41.000000000 +0100
--- source/smbd/trans2.c        2009-07-01 12:17:16.000000000 +0200
***************
*** 2583,2612 ****
--- 2583,2642 ----
                                        CIFS_UNIX_POSIX_PATH_OPERATIONS_CAP)));
                        break;
  
                case SMB_QUERY_POSIX_FS_INFO:
                {
                        int rc;
                        vfs_statvfs_struct svfs;
  
                        if (!lp_unix_extensions()) {
                                return ERROR_NT(NT_STATUS_INVALID_LEVEL);
                        }
  
                        rc = SMB_VFS_STATVFS(conn, ".", &svfs);
  
                        if (!rc) {
+ 
+                               {
+                                       SMB_BIG_UINT 
dfree,dsize,bsize,block_size,sectors_per_unit,bytes_per_sector;
+ 
+                                       if 
(get_dfree_info(conn,".",False,&bsize,&dfree,&dsize) != (SMB_BIG_UINT)-1) {
+                                               block_size = 
lp_block_size(snum);
+                                               if (bsize < block_size) {
+                                                       SMB_BIG_UINT factor = 
block_size/bsize;
+                                                       bsize = block_size; 
+                                                       dsize /= factor;
+                                                       dfree /= factor;
+                                               }
+                                               if (bsize > block_size) {
+                                                       SMB_BIG_UINT factor = 
bsize/block_size;
+                                                       bsize = block_size; 
+                                                       dsize *= factor;
+                                                       dfree *= factor;
+                                               }
+                                               bytes_per_sector = 512;
+                                               sectors_per_unit = 
bsize/bytes_per_sector;
+ 
+                                               svfs.BlockSize = bsize;
+                                               svfs.TotalBlocks = dsize;
+                                               svfs.BlocksAvail = dfree;
+                                               svfs.UserBlocksAvail = dfree;
+                                               svfs.TotalFileNodes = 0;
+                                               svfs.FreeFileNodes = 0;
+                                       }
+                               }
+ 
                                data_len = 56;
                                SIVAL(pdata,0,svfs.OptimalTransferSize);
                                SIVAL(pdata,4,svfs.BlockSize);
                                SBIG_UINT(pdata,8,svfs.TotalBlocks);
                                SBIG_UINT(pdata,16,svfs.BlocksAvail);
                                SBIG_UINT(pdata,24,svfs.UserBlocksAvail);
                                SBIG_UINT(pdata,32,svfs.TotalFileNodes);
                                SBIG_UINT(pdata,40,svfs.FreeFileNodes);
                                SBIG_UINT(pdata,48,svfs.FsIdentifier);
                                DEBUG(5,("call_trans2qfsinfo : 
SMB_QUERY_POSIX_FS_INFO succsessful\n"));
  #ifdef EOPNOTSUPP
                        } else if (rc == EOPNOTSUPP) {
                                return ERROR_NT(NT_STATUS_INVALID_LEVEL);
  #endif /* EOPNOTSUPP */
                        } else {
-- 
To unsubscribe from this list go to the following URL and read the
instructions:  https://lists.samba.org/mailman/options/samba

Reply via email to