file_set_sparse needs to be a handle based call.
authorJeremy Allison <jra@samba.org>
Fri, 17 Dec 2010 00:42:33 +0000 (16:42 -0800)
committerJeremy Allison <jra@samba.org>
Fri, 17 Dec 2010 20:11:04 +0000 (21:11 +0100)
source3/include/proto.h
source3/smbd/dosmode.c
source3/smbd/nttrans.c

index 53c1f5d370aa7cb0fe6c8ee11c639372f017ce54..95833883623baaf0709f8117eedf13bc1305be52 100644 (file)
@@ -4621,7 +4621,7 @@ uint32 dos_mode(connection_struct *conn, struct smb_filename *smb_fname);
 int file_set_dosmode(connection_struct *conn, struct smb_filename *smb_fname,
                     uint32 dosmode, const char *parent_dir, bool newfile);
 NTSTATUS file_set_sparse(connection_struct *conn,
-                        struct smb_filename *smb_fname,
+                        struct files_struct *fsp,
                         bool sparse);
 int file_ntimes(connection_struct *conn, const struct smb_filename *smb_fname,
                struct smb_file_time *ft);
index 5d6e4b4760e439edde01ae0f976609e90a06f8ad..86f78075062d4bf9926ca0e5d12b33233a7e2ac7 100644 (file)
@@ -848,27 +848,26 @@ int file_set_dosmode(connection_struct *conn, struct smb_filename *smb_fname,
 
 
 NTSTATUS file_set_sparse(connection_struct *conn,
-                        struct smb_filename *smb_fname,
+                        files_struct *fsp,
                         bool sparse)
 {
-       SMB_STRUCT_STAT st;
        uint32_t old_dosmode;
        uint32_t new_dosmode;
+       NTSTATUS status;
 
        DEBUG(10,("file_set_sparse: setting sparse bit %u on file %s\n",
-                 sparse, smb_fname_str_dbg(smb_fname)));
+                 sparse, smb_fname_str_dbg(fsp->fsp_name)));
 
        if (!lp_store_dos_attributes(SNUM(conn))) {
                return NT_STATUS_INVALID_DEVICE_REQUEST;
        }
 
-       SET_STAT_INVALID(st);
-
-       if (SMB_VFS_STAT(conn, smb_fname)) {
-               return map_nt_error_from_unix(errno);
+       status = vfs_stat_fsp(fsp);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
        }
 
-       old_dosmode = dos_mode(conn, smb_fname);
+       old_dosmode = dos_mode(conn, fsp->fsp_name);
 
        if (sparse && !(old_dosmode & FILE_ATTRIBUTE_SPARSE)) {
                new_dosmode = old_dosmode | FILE_ATTRIBUTE_SPARSE;
@@ -879,7 +878,7 @@ NTSTATUS file_set_sparse(connection_struct *conn,
        }
 
        /* Store the DOS attributes in an EA. */
-       if (!set_ea_dos_attribute(conn, smb_fname,
+       if (!set_ea_dos_attribute(conn, fsp->fsp_name,
                                  new_dosmode)) {
                if (errno == 0) {
                        errno = EIO;
@@ -894,7 +893,6 @@ NTSTATUS file_set_sparse(connection_struct *conn,
        return NT_STATUS_OK;
 }
 
-
 /*******************************************************************
  Wrapper around the VFS ntimes that possibly allows DOS semantics rather
  than POSIX.
index 8d92d606428daf2826b6899b8b4d86b7a8d1cdd2..55804b90355e5ee139791fba2acee5708951dc70 100644 (file)
@@ -2140,7 +2140,7 @@ static void call_nt_transact_ioctl(connection_struct *conn,
                        return;
                }
 
-               status = file_set_sparse(conn, fsp->fsp_name, set_sparse);
+               status = file_set_sparse(conn, fsp, set_sparse);
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(9,("FSCTL_SET_SPARSE: fname[%s] set[%u] - %s\n",
                                 smb_fname_str_dbg(fsp->fsp_name), set_sparse, nt_errstr(status)));