namei: Create the IH_CREATE_INIT function
authorAndrew Deason <adeason@sinenomine.net>
Thu, 30 May 2013 22:53:56 +0000 (17:53 -0500)
committerDerrick Brashear <shadow@your-file-system.com>
Thu, 20 Jun 2013 12:23:48 +0000 (05:23 -0700)
Create a new function that combines calls to IH_CREATE and IH_INIT
into one operation; the new function is called IH_CREATE_INIT. This
allows a caller to create a file and then use it, without needing to
open() the file twice.

This is currently only implemented for the Unix namei backend; other
backends result in effectively the same functionality (but can use the
same API).

Change-Id: I93d531a9892beeb0c1ceac18458cbe0f1e3a0ded
Reviewed-on: http://gerrit.openafs.org/9969
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
Tested-by: Derrick Brashear <shadow@your-file-system.com>

src/vol/ihandle.c
src/vol/ihandle.h
src/vol/namei_ops.c
src/vol/namei_ops.h

index c87f43d..16d2332 100644 (file)
@@ -1051,6 +1051,23 @@ ih_icreate(IHandle_t * ih, int dev, char *part, Inode nI, int p1, int p2,
 }
 #endif /* AFS_NAMEI_ENV */
 
+#if defined(AFS_NT40_ENV) || !defined(AFS_NAMEI_ENV)
+/* Unix namei implements its own more efficient IH_CREATE_INIT; this wrapper
+ * is for everyone else */
+IHandle_t *
+ih_icreate_init(IHandle_t *lh, int dev, char *part, Inode nearInode,
+                afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4)
+{
+    IHandle_t *ihP;
+    Inode ino = IH_CREATE(lh, dev, part, nearInode, p1, p2, p3, p4);
+    if (!VALID_INO(ino)) {
+        return NULL;
+    }
+    IH_INIT(ihP, dev, p1, ino);
+    return ihP;
+}
+#endif
+
 afs_sfsize_t
 ih_size(FD_t fd)
 {
index 8d60e3b..56223ed 100644 (file)
@@ -420,6 +420,11 @@ extern int ih_isunlinked(FD_t fd);
 # define OS_DIRSEPC '/'
 #endif
 
+#if defined(AFS_NT40_ENV) || !defined(AFS_NAMEI_ENV)
+# define  IH_CREATE_INIT(H, D, P, N, P1, P2, P3, P4) \
+         ih_icreate_init(H, D, P, N, P1, P2, P3, P4)
+#endif
+
 #ifdef AFS_NAMEI_ENV
 
 # ifdef AFS_NT40_ENV
@@ -485,6 +490,8 @@ extern int OS_TRUNC(FD_t FD, OFFT L);
 #  endif /* !O_LARGEFILE */
 
 #  define OS_SYNC(FD) fsync(FD)
+#  define IH_CREATE_INIT(H, D, P, N, P1, P2, P3, P4) \
+          namei_icreate_init(H, D, P, P1, P2, P3, P4)
 
 /*@=fcnmacros =macrofcndecl@*/
 # endif /* AFS_NT40_ENV */
index c48c1b2..c5ea7ae 100644 (file)
@@ -952,7 +952,8 @@ bad:
 }
 #else /* !AFS_NT40_ENV */
 Inode
-namei_icreate(IHandle_t * lh, char *part, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4)
+icreate(IHandle_t * lh, char *part, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
+        FD_t *afd, Inode *ainode)
 {
     namei_t name;
     int fd = INVALID_FD;
@@ -1042,10 +1043,6 @@ namei_icreate(IHandle_t * lh, char *part, afs_uint32 p1, afs_uint32 p2, afs_uint
     }
 
   bad:
-    if (fd != INVALID_FD)
-       OS_CLOSE(fd);
-
-
     if (code || (fd == INVALID_FD)) {
        if (p2 != -1) {
            fdP = IH_OPEN(lh);
@@ -1055,7 +1052,56 @@ namei_icreate(IHandle_t * lh, char *part, afs_uint32 p1, afs_uint32 p2, afs_uint
            }
        }
     }
-    return (code || (fd == INVALID_FD)) ? (Inode) - 1 : tmp.ih_ino;
+
+    *afd = fd;
+    *ainode = tmp.ih_ino;
+
+    return code;
+}
+
+Inode
+namei_icreate(IHandle_t * lh, char *part,
+              afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4)
+{
+    Inode ino = 0;
+    int fd = INVALID_FD;
+    int code;
+
+    code = icreate(lh, part, p1, p2, p3, p4, &fd, &ino);
+    if (fd != INVALID_FD) {
+       close(fd);
+    }
+    return (code || (fd == INVALID_FD)) ? (Inode) - 1 : ino;
+}
+
+IHandle_t *
+namei_icreate_init(IHandle_t * lh, int dev, char *part,
+                   afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4)
+{
+    Inode ino = 0;
+    int fd = INVALID_FD;
+    int code;
+    IHandle_t *ihP;
+    FdHandle_t *fdP;
+
+    code = icreate(lh, part, p1, p2, p3, p4, &fd, &ino);
+    if (fd == INVALID_FD) {
+       return NULL;
+    }
+    if (code) {
+       close(fd);
+       return NULL;
+    }
+
+    IH_INIT(ihP, dev, p1, ino);
+    fdP = ih_attachfd(ihP, fd);
+    if (!fdP) {
+       close(fd);
+    } else {
+       FDH_CLOSE(fdP);
+    }
+
+    return ihP;
 }
 #endif
 
index d3cf996..cacb42f 100644 (file)
@@ -22,6 +22,9 @@ extern int namei_unlink(char *name);
 extern Inode namei_MakeSpecIno(VolumeId volid, int type);
 extern Inode namei_icreate(IHandle_t * lh, char *part, afs_uint32 p1,
                           afs_uint32 p2, afs_uint32 p3, afs_uint32 p4);
+extern IHandle_t *namei_icreate_init(IHandle_t *lh, int dev, char *part,
+                                     afs_uint32 p1, afs_uint32 p2,
+                                     afs_uint32 p3, afs_uint32 p4);
 extern FD_t namei_iopen(IHandle_t * h);
 extern int namei_irelease(IHandle_t * h);
 afs_sfsize_t namei_iread(IHandle_t * h, afs_foff_t offset, char *buf,