Skip to contentSkip to conversation

use lpath_to_handle when restoring symlinks

PATCH In review Bill Kendall 3 participants 5 messages Oct 22, 2009 – Oct 28, 2009

lore
Share & tools
lore
#0 lore raw

PATCH 2/2 use lpath_to_handle when restoring symlinks

Update xfsrestore to use the new lpath_to_handle function when dealing with symlinks.

restore/content.c +21 -34
index eb6e78c..99549a8 100644
@@ -797,7 +797,6 @@ static void partial_reg(ix_t d_index, xfs_ino_t ino, off64_t fsize,
                         off64_t offset, off64_t sz);
 static bool_t partial_check (xfs_ino_t ino, off64_t fsize);
 static bool_t partial_check2 (partial_rest_t *isptr, off64_t fsize);
-static int do_fssetdm_by_handle( char *path, fsdmidata_t *fdmp);
 static int quotafilecheck(char *type, char *dstdir, char *quotafile);
 
 /* definition of locally defined global variables ****************************/
@@ -7895,14 +7894,28 @@ restore_symlink( drive_t *drivep,
 		}
 
 		if ( persp->a.restoredmpr) {
-		fsdmidata_t fssetdm;
-		
-		/*	Restore DMAPI fields. */
+			fsdmidata_t fssetdm;
+			void *hanp;
+			size_t hlen=0;
 
-		fssetdm.fsd_dmevmask = bstatp->bs_dmevmask;
-		fssetdm.fsd_padding = 0;
-		fssetdm.fsd_dmstate = bstatp->bs_dmstate;
-		rval = do_fssetdm_by_handle(path, &fssetdm);
+			/*	Restore DMAPI fields. */
+			fssetdm.fsd_dmevmask = bstatp->bs_dmevmask;
+			fssetdm.fsd_padding = 0;
+			fssetdm.fsd_dmstate = bstatp->bs_dmstate;
+
+			if (lpath_to_handle(persp->a.dstdir, path, &hanp, &hlen)) {
+				mlog( MLOG_NORMAL | MLOG_WARNING, _(
+					"lpath_to_handle of %s failed: %s\n"),
+					path, strerror( errno ));
+			} else {
+				if (fssetdm_by_handle(hanp, hlen, &fssetdm)) {
+					mlog( MLOG_NORMAL | MLOG_WARNING,
+						_("fssetdm_by_handle of %s "
+						"failed: %s\n"),
+						path, strerror( errno ));
+				}
+				free_handle(hanp, hlen);
+			}
 		}
 	}
 
@@ -9525,32 +9538,6 @@ display_needed_objects( purp_t purp,
 }
 
 static int
-do_fssetdm_by_handle(
-	char		*path,
-	fsdmidata_t	*fdmp)
-{
-	void		*hanp;
-	size_t		hlen=0;
-	int		rc;
-
-	if (path_to_handle(path, &hanp, &hlen)) {
-		mlog( MLOG_NORMAL | MLOG_WARNING, _(
-			"path_to_handle of %s failed:%s\n"),
-			path, strerror( errno ));
-		return -1;
-	}
-
-	rc = fssetdm_by_handle(hanp, hlen, fdmp);
-	free_handle(hanp, hlen);
-	if (rc) {
-		mlog( MLOG_NORMAL | MLOG_WARNING, _(
-			"fssetdm_by_handle of %s failed %s\n"),
-			path, strerror( errno ));
-	}
-	return rc;
-}
-
-static int
 quotafilecheck(char *type, char *dstdir, char *quotafile)
 {
 	struct stat s;

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

Reviewed-by on v1 2/2
#1 lore raw
Quoted 2 lines · Bill Kendall

Update xfsrestore to use the new lpath_to_handle function when dealing with symlinks.

Looks good. -Alex

Quoted 1 line
Quoted 82 lines
restore/content.c +21 -34
index eb6e78c..99549a8 100644
@@ -797,7 +797,6 @@ static void partial_reg(ix_t d_index, xfs_ino_t ino, off64_t fsize,
                          off64_t offset, off64_t sz);
  static bool_t partial_check (xfs_ino_t ino, off64_t fsize);
  static bool_t partial_check2 (partial_rest_t *isptr, off64_t fsize);
-static int do_fssetdm_by_handle( char *path, fsdmidata_t *fdmp);
  static int quotafilecheck(char *type, char *dstdir, char *quotafile);
 
  /* definition of locally defined global variables ****************************/
@@ -7895,14 +7894,28 @@ restore_symlink( drive_t *drivep,
  		}
 
  		if ( persp->a.restoredmpr) {
-		fsdmidata_t fssetdm;
-
-		/*	Restore DMAPI fields. */
+			fsdmidata_t fssetdm;
+			void *hanp;
+			size_t hlen=0;
 
-		fssetdm.fsd_dmevmask = bstatp->bs_dmevmask;
-		fssetdm.fsd_padding = 0;
-		fssetdm.fsd_dmstate = bstatp->bs_dmstate;
-		rval = do_fssetdm_by_handle(path, &fssetdm);
+			/*	Restore DMAPI fields. */
+			fssetdm.fsd_dmevmask = bstatp->bs_dmevmask;
+			fssetdm.fsd_padding = 0;
+			fssetdm.fsd_dmstate = bstatp->bs_dmstate;
+
+			if (lpath_to_handle(persp->a.dstdir, path, &hanp, &hlen)) {
+				mlog( MLOG_NORMAL | MLOG_WARNING, _(
+					"lpath_to_handle of %s failed: %s\n"),
+					path, strerror( errno ));
+			} else {
+				if (fssetdm_by_handle(hanp, hlen, &fssetdm)) {
+					mlog( MLOG_NORMAL | MLOG_WARNING,
+						_("fssetdm_by_handle of %s "
+						"failed: %s\n"),
+						path, strerror( errno ));
+				}
+				free_handle(hanp, hlen);
+			}
  		}
  	}
 
@@ -9525,32 +9538,6 @@ display_needed_objects( purp_t purp,
  }
 
  static int
-do_fssetdm_by_handle(
-	char		*path,
-	fsdmidata_t	*fdmp)
-{
-	void		*hanp;
-	size_t		hlen=0;
-	int		rc;
-
-	if (path_to_handle(path, &hanp, &hlen)) {
-		mlog( MLOG_NORMAL | MLOG_WARNING, _(
-			"path_to_handle of %s failed:%s\n"),
-			path, strerror( errno ));
-		return -1;
-	}
-
-	rc = fssetdm_by_handle(hanp, hlen, fdmp);
-	free_handle(hanp, hlen);
-	if (rc) {
-		mlog( MLOG_NORMAL | MLOG_WARNING, _(
-			"fssetdm_by_handle of %s failed %s\n"),
-			path, strerror( errno ));
-	}
-	return rc;
-}
-
-static int
  quotafilecheck(char *type, char *dstdir, char *quotafile)
  {
  	struct stat s;
Quoted 4 lines

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#2 lore raw
In reply to Bill Kendall
Quoted 2 lines · Bill Kendall

Update xfsrestore to use the new lpath_to_handle function when dealing with symlinks.

Requiring a simultanously released version of xfsprogs is a very bad idea. The right fix is to add an autoconf check for the new function and use it when available, falling back to the inferior old version if it is not available.

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#3 lore raw
Quoted 8 lines · Christoph Hellwig
Quoted 2 lines · Bill Kendall

Update xfsrestore to use the new lpath_to_handle function when dealing with symlinks.

Requiring a simultanously released version of xfsprogs is a very bad idea. The right fix is to add an autoconf check for the new function and use it when available, falling back to the inferior old version if it is not available.

Good thought. However, there's also a run-time dependency since xfsrestore uses libhandle.so rather than the .a. I can rework something using dlsym - sound okay?

Bill

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#4 lore raw
Quoted 5 lines · Bill Kendall
Quoted 4 lines · Christoph Hellwig
Quoted 2 lines · Bill Kendall

Update xfsrestore to use the new lpath_to_handle function when dealing with symlinks.

Quoted 8 lines
Quoted 4 lines

Requiring a simultanously released version of xfsprogs is a very bad idea. The right fix is to add an autoconf check for the new function and use it when available, falling back to the inferior old version if it is not available.

Good thought. However, there's also a run-time dependency since xfsrestore uses libhandle.so rather than the .a. I can rework something using dlsym - sound okay?

That's why the minor version of a shared library needs to get bumped when adding a new symbol, see one of my replies to Alex. Of course symbol versioning would be even better, I'll see if I can port it from acl/attr which use the same build system as xfsprogs.

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs