linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH opensm] Implement atomic update operation for sa_db_file
@ 2013-11-13 16:27 Hal Rosenstock
       [not found] ` <5283A88D.9020608-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Hal Rosenstock @ 2013-11-13 16:27 UTC (permalink / raw)
  To: linux-rdma (linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org)
  Cc: Vladimir Koushnir


From: Vladimir Koushnir <vladimirk-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>

Signed-off-by: Vladimir Koushnir <vladimirk-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
---
 opensm/osm_sa.c |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/opensm/osm_sa.c b/opensm/osm_sa.c
index 8c5ef5d..d5c1275 100644
--- a/opensm/osm_sa.c
+++ b/opensm/osm_sa.c
@@ -525,25 +525,37 @@ opensm_dump_to_file(osm_opensm_t * p_osm, const char *file_name,
 		    void (*dump_func) (osm_opensm_t * p_osm, FILE * file))
 {
 	char path[1024];
+	char path_tmp[1032];
 	FILE *file;
+	int status = 0;
 
 	snprintf(path, sizeof(path), "%s/%s",
 		 p_osm->subn.opt.dump_files_dir, file_name);
 
-	file = fopen(path, "w");
+	snprintf(path_tmp, sizeof(path_tmp), "%s.tmp", path);
+
+	file = fopen(path_tmp, "w");
 	if (!file) {
 		OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "ERR 4C01: "
 			"cannot open file \'%s\': %s\n",
-			file_name, strerror(errno));
+			path_tmp, strerror(errno));
 		return -1;
 	}
 
-	chmod(path, S_IRUSR | S_IWUSR);
+	chmod(path_tmp, S_IRUSR | S_IWUSR);
 
 	dump_func(p_osm, file);
 
 	fclose(file);
-	return 0;
+
+	status = rename(path_tmp, path);
+	if (status) {
+		OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "ERR 4C0B: "
+			"Failed to rename file:%s (err:%s)\n",
+			path_tmp, strerror(errno));
+	}
+
+	return status;
 }
 
 static void mcast_mgr_dump_one_port(cl_map_item_t * p_map_item, void *cxt)
-- 
1.7.8.2

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH opensm] Implement atomic update operation for sa_db_file
       [not found] ` <5283A88D.9020608-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
@ 2013-11-13 18:00   ` Bart Van Assche
       [not found]     ` <5283BE32.5070804-HInyCGIudOg@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Bart Van Assche @ 2013-11-13 18:00 UTC (permalink / raw)
  To: Hal Rosenstock,
	linux-rdma (linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org)
  Cc: Vladimir Koushnir

On 11/13/13 17:27, Hal Rosenstock wrote:
>
> From: Vladimir Koushnir <vladimirk-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
>
> Signed-off-by: Vladimir Koushnir <vladimirk-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
> ---
>   opensm/osm_sa.c |   20 ++++++++++++++++----
>   1 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/opensm/osm_sa.c b/opensm/osm_sa.c
> index 8c5ef5d..d5c1275 100644
> --- a/opensm/osm_sa.c
> +++ b/opensm/osm_sa.c
> @@ -525,25 +525,37 @@ opensm_dump_to_file(osm_opensm_t * p_osm, const char *file_name,
>   		    void (*dump_func) (osm_opensm_t * p_osm, FILE * file))
>   {
>   	char path[1024];
> +	char path_tmp[1032];
>   	FILE *file;
> +	int status = 0;
>
>   	snprintf(path, sizeof(path), "%s/%s",
>   		 p_osm->subn.opt.dump_files_dir, file_name);
>
> -	file = fopen(path, "w");
> +	snprintf(path_tmp, sizeof(path_tmp), "%s.tmp", path);
> +
> +	file = fopen(path_tmp, "w");
>   	if (!file) {
>   		OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "ERR 4C01: "
>   			"cannot open file \'%s\': %s\n",
> -			file_name, strerror(errno));
> +			path_tmp, strerror(errno));
>   		return -1;
>   	}
>
> -	chmod(path, S_IRUSR | S_IWUSR);
> +	chmod(path_tmp, S_IRUSR | S_IWUSR);
>
>   	dump_func(p_osm, file);
>
>   	fclose(file);
> -	return 0;
> +
> +	status = rename(path_tmp, path);
> +	if (status) {
> +		OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "ERR 4C0B: "
> +			"Failed to rename file:%s (err:%s)\n",
> +			path_tmp, strerror(errno));
> +	}
> +
> +	return status;
>   }
>
>   static void mcast_mgr_dump_one_port(cl_map_item_t * p_map_item, void *cxt)

Isn't an fdatasync() call missing after dump_func() and before fclose() 
? According to Theodore Ts'o calling fdatasync() or fsync() before 
fclose() is essential during an atomic update. See also 
http://thunk.org/tytso/blog/2009/03/15/dont-fear-the-fsync/ for more 
information.

Bart.

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH opensm] Implement atomic update operation for sa_db_file
       [not found]     ` <5283BE32.5070804-HInyCGIudOg@public.gmane.org>
@ 2013-11-22 14:57       ` Hal Rosenstock
       [not found]         ` <528F70BC.1050907-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Hal Rosenstock @ 2013-11-22 14:57 UTC (permalink / raw)
  To: Bart Van Assche
  Cc: linux-rdma (linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org),
	Vladimir Koushnir

Hi Bart,

On 11/13/2013 1:00 PM, Bart Van Assche wrote:
> Isn't an fdatasync() call missing after dump_func() and before fclose()
> ? According to Theodore Ts'o calling fdatasync() or fsync() before
> fclose() is essential during an atomic update. See also
> http://thunk.org/tytso/blog/2009/03/15/dont-fear-the-fsync/ for more
> information.

Thanks for the pointer. Yes, an fsync is appropriate here. Do you want
to send a patch for that or should I just cruft one up ?

-- Hal

> Bart.

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH opensm] Implement atomic update operation for sa_db_file
       [not found]         ` <528F70BC.1050907-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
@ 2013-11-22 15:27           ` Bart Van Assche
  0 siblings, 0 replies; 4+ messages in thread
From: Bart Van Assche @ 2013-11-22 15:27 UTC (permalink / raw)
  To: Hal Rosenstock
  Cc: linux-rdma (linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org),
	Vladimir Koushnir

On 11/22/13 15:57, Hal Rosenstock wrote:
> Hi Bart,
> 
> On 11/13/2013 1:00 PM, Bart Van Assche wrote:
>> Isn't an fdatasync() call missing after dump_func() and before fclose()
>> ? According to Theodore Ts'o calling fdatasync() or fsync() before
>> fclose() is essential during an atomic update. See also
>> http://thunk.org/tytso/blog/2009/03/15/dont-fear-the-fsync/ for more
>> information.
> 
> Thanks for the pointer. Yes, an fsync is appropriate here. Do you want
> to send a patch for that or should I just cruft one up ?

If you can look into this that's fine for me. I'm already involved in
too many different open source projects :-)

Bart.

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-11-22 15:27 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-13 16:27 [PATCH opensm] Implement atomic update operation for sa_db_file Hal Rosenstock
     [not found] ` <5283A88D.9020608-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2013-11-13 18:00   ` Bart Van Assche
     [not found]     ` <5283BE32.5070804-HInyCGIudOg@public.gmane.org>
2013-11-22 14:57       ` Hal Rosenstock
     [not found]         ` <528F70BC.1050907-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2013-11-22 15:27           ` Bart Van Assche

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).